128位比较和交换内在

时间:2016-11-27 10:00:41

标签: c++ c++11

我试图在包含__int128的C ++联合上执行128位cas - 我是否需要将此联合对齐以使用https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html中的__atomic_compare_exchange_n内在函数?

1 个答案:

答案 0 :(得分:4)

完全取决于您的目标架构。

如果您使用的是x86,那么您链接的the documentation表示128位类型没有原子比较和交换:

  

'__atomic'内置函数可以与长度为1,2,4或8个字节的任何整数标量或指针类型一起使用。如果架构支持'__int128'(参见__int128),也允许使用16字节整数类型。

__int128的链接文档中,它说:

  

作为扩展,整数标量类型__int128支持具有足以容纳128位的整数模式的目标。只需为带符号的128位整数写__int128,或为无符号的128位整数写无符号__int128。 GCC中不支持为长整数小于128位的目标表示__int128类型的整数常量。

x86没有足够宽的整数模式来保存128位。即使在64位x86上,long long类型也对应于64位整数,小于128位宽。因此,文档表明x86上的128位类型不支持内在函数。

也就是说,x86架构 具有cmpxchg16b指令,允许16字节类型的原子比较和交换。我不知道GCC __atomic内置插件是否支持发出此指令。 (不幸的是,there are some x86 processors that do not support this instruction;您需要确定目标处理器是否支持它,或者编写执行运行时检查的代码,如果不支持,则返回到备用实现。早期的64位AMD处理器不支持cmpxchg16b,而且英特尔酷睿/酷睿2处理器的某些步进也缺乏支持。它也是not supported by Intel's Many Integrated Core (MIC) architecture。)

无论如何,cmpxchg16b 实际上要求其目标操作数是16字节对齐的,因此任何导致它被发出的内在函数都会对其用户产生相同的要求。使用__attribute__(( __aligned__(16)))进行注释将实现此目标。

如果您使用的是x86以外的体系结构,并且它本身支持标量128位整数类型,那么您必须查阅其文档以查看其比较和交换指令是否需要对齐。它可能会这样做,即使在没有必要的情况下也几乎不会损害性能以协调数据。