17

最近一个问题的启发,我想知道是否有人知道如何在 Linux x86-64 平台上gcc生成 x86-64bts指令(位测试和设置),而不使用内联汇编或非标准编译器内在函数。

相关问题:

可移植性对我来说比 更重要bts,所以我不会使用 andasm指令,如果有其他解决方案,我宁愿不使用编译器内在函数。

编辑:C 源语言不支持原子操作,所以我对获得原子测试和设置并不特别感兴趣(尽管这是测试和设置首先存在的最初原因)。如果我想要一些原子的东西,我知道我没有机会用标准的 C 源代码来做:它必须是内在的、库函数或内联汇编。(我在支持多线程的编译器中实现了原子操作。)

4

3 回答 3

2

它在第一个链接的第一个答案中-在宏伟的计划中有多重要。测试位时的唯一部分是:

  • 低级驱动程序。但是,如果您正在编写一个您可能知道 ASM 的程序,那么它对系统来说已经足够了,而且可能大多数延迟都发生在 I/O 上
  • 测试标志。它通常是在初始化(仅在开始时一次)或一些共享计算(这需要更多时间)。

即使微基准测试显示出改进,对应用程序和宏基准测试性能的整体影响也可能很小。

编辑部分——bts单独使用并不能保证操作的原子性。它只保证它在这个核心上是原子的(or在内存上也是如此)。在多处理器单元(不常见)或多核单元(非常常见)上,您仍然必须与其他处理器同步。

由于同步要昂贵得多,我相信以下之间的区别:

asm("lock bts %0, %1" : "+m" (*array) : "r" (bit));

asm("lock or %0, %1" : "+m" (*array) : "r" (1 << bit));

是最小的。第二种形式:

  • 可以同时设置多个标志
  • 有很好的__sync_fetch_and_or (array, 1 << bit)形式(据我记得在 gcc 和 intel 编译器上工作)。
于 2010-03-06T11:21:55.540 回答
1

我使用 gcc atomic builtins,例如__sync_lock_test_and_sethttp://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html)。更改-march标志将直接影响生成的内容。我现在正在使用它i686,但是http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options显示了所有可能性。

我意识到这并不完全符合您的要求,但是当我在寻找类似的机制时,我发现这两个网页非常有用。

于 2010-01-11T09:51:45.877 回答
0

我相信(但不确定)C++ 或 C 标准都没有针对这些类型的同步机制的任何机制。对更高级别同步机制的支持处于各种标准化状态,但我什至认为其中一种不会允许您访问您所追求的原语类型。

您是否正在编写锁不足的无锁数据结构?

您可能只想继续使用 gcc 的非标准扩展和/或操作系统或库提供的同步原语。如果您担心使用编译器内在函数,我敢打赌,有一个库可以提供您正在寻找的可移植性类型。(虽然真的,我认为大多数人只是硬着头皮在需要时使用 gcc 特定的代码。并不理想,但标准并没有真正跟上。)

于 2010-01-11T09:44:06.767 回答