Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 AVX512比较和交换_X86_Avx_Compare And Swap_Avx512 - Fatal编程技术网

X86 AVX512比较和交换

X86 AVX512比较和交换,x86,avx,compare-and-swap,avx512,X86,Avx,Compare And Swap,Avx512,AVX512集合中是否有原子CAS指令或等效指令 我无法立即找到一个,但没有最好的google fu。除了锁cmpxchg16b(16字节)之外,x86没有任何保证大于8字节的原子操作。对齐的向量加载/存储是当前CPU上的元素级原子(即8字节元素内无撕裂) 您希望使用64字节的整个缓存线吗?这方面没有单一的指示 AVX512本身并不能提供这一功能,但有了它,您可以自己使用。将加载+比较+存储放在事务中。IDK将xbegin/xend与lock cmpxchg相比有多贵 您也不需要AVX512;整

AVX512集合中是否有原子CAS指令或等效指令


我无法立即找到一个,但没有最好的google fu。

除了
锁cmpxchg16b
(16字节)之外,x86没有任何保证大于8字节的原子操作。对齐的向量加载/存储是当前CPU上的元素级原子(即8字节元素内无撕裂)

您希望使用64字节的整个缓存线吗?这方面没有单一的指示

AVX512本身并不能提供这一功能,但有了它,您可以自己使用。将加载+比较+存储放在事务中。IDK将
xbegin
/
xend
lock cmpxchg
相比有多贵


您也不需要AVX512;整个事务以原子方式提交或根本不提交,因此您可以使用一对AVX2加载/比较指令来实现64字节的CAS。

我不这么认为-您实际上想要实现什么?我想不出有哪种用例需要原子SIMD比较和交换(可能是元素方面的?)@PaulR我在考虑无锁数据结构,例如同时封装多个压缩64位整数。我的具体想法(如果原子512位CAS是可能的)是一个trie,其中256位掩码表示存在,256位掩码表示4个指针,按掩码中存在的顺序排列。如果使用32位指针(或相对于64位基指针的32位数组偏移量),则可以在同一个向量中容纳两倍的元素。但原子64字节加载也不可能(同样没有事务),因此即使是这种数据结构的读取器也需要昂贵的操作。除非您只需要在特定的Skylake-AVX512机器上使用它,否则对齐的64字节加载/存储实际上可能是原子的,即使纸上的x86不能保证这一点。(一些未来的AMD CPU可能会以多个较小的负载/存储运行512位操作。)感谢您提供的信息:)遗憾的是,没有TSX是不可能的(我以前用过TSX,发现它的开销太大,目前无法实现)。@AlexR:的确,如果有某种方法可以查询当前CPU上操作的原子宽度,那就太好了,这样您就可以利用CPU上的原子64字节负载,而实际操作是原子的。(这不会为您提供原子CA,但它会使读取路径变得便宜。)我想如果有SIMD原子,没有SIMD RMW指令,这会很有趣,因此加载/存储执行单元目前不需要在FP端对读取-修改-写入的任何支持,只需要整数,如果核心之间的缓存线传输必须是原子的,那么这可能会限制芯片组。它们在普通的英特尔机器上,但可能具有8个以上插槽的异国机器可能会使用自定义粘合逻辑。。。实际上,AMD CPU可以在缓存线传输上进行撕裂,即使在单个套接字中向量存储是原子的:我很好奇为什么,如果
lock
prefix锁定了整个缓存线,我们不能锁定缓存线,执行任意指令,然后在我们完成后解锁它?@NickStrupat:因为如果软件使用错误,这可能会导致硬件死锁。只为一条指令自动锁定不会有这个问题。然而,TSX(事务性内存)确实提供了您所需要的,可能跨越多条线路。(对于冲突事务中止,不是死锁,但这意味着软件必须意识到可能需要重试,并提供分支地址。)类似地,在其他体系结构上,LL/SC允许您以原子RMW的形式对一个内存位置执行任意操作,但不是整行。)