我正在尝试在包含__int128的C++联合上执行128位cas-我是否需要对齐此联合才能使用https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html的__atomic_compare_exchange_n内在函数?
最佳答案
这完全取决于您的目标体系结构。
如果您使用的是x86,则链接的the documentation表示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
,并且某些Intel Core / Core 2处理器的步骤也缺乏支持。它也为not supported by Intel's Many Integrated Core (MIC) architecture。)
无论如何,cmpxchg16b
实际上确实要求其目标操作数是16字节对齐的,因此任何导致其发出的内在函数都会对其用户提出相同的要求。用__attribute__(( __aligned__(16)))
注释将实现此目标。
如果您使用的是x86以外的体系结构,并且本机支持标量128位整数类型,那么您必须查阅其文档以查看其比较交换指令是否需要对齐。它可能做到了,即使在没有必要的情况下,对齐数据也几乎不会损害性能。
关于c++ - 128位比较和交换固有,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40827685/