Multithreading 测试C++;11/C11获取发布语义

Multithreading 测试C++;11/C11获取发布语义,multithreading,c++11,processor,c11,Multithreading,C++11,Processor,C11,我正在寻找一种处理器,它执行读取获取/存储释放,其语义与C11/C++11标准中指定的相同 x86处理器同步性太强,因此无法使用acquire/release语义测试无锁算法 这似乎同样适用于ARM处理器,因为这种体系结构提供了更强或更弱的读取/存储同步。也许ARMv8.3可以提供正确的语义,但我相信市场上没有ARMv8.3处理器 在哪个处理器或体系结构中,我应该使用获取释放语义测试锁算法?< /P> C和C++规范使用抽象模型来存储和CPU。不必存在遵循该抽象模型的现有(旧的或新的)处理器。P

我正在寻找一种处理器,它执行读取获取/存储释放,其语义与C11/C++11标准中指定的相同

x86处理器同步性太强,因此无法使用acquire/release语义测试无锁算法

这似乎同样适用于ARM处理器,因为这种体系结构提供了更强或更弱的读取/存储同步。也许ARMv8.3可以提供正确的语义,但我相信市场上没有ARMv8.3处理器


在哪个处理器或体系结构中,我应该使用获取释放语义测试锁算法?< /P> C和C++规范使用抽象模型来存储和CPU。不必存在遵循该抽象模型的现有(旧的或新的)处理器。PowerPC是出了名的弱有序处理器,因此它可能是一个很好的ISA测试平台。如果可能的话,使用多个编译器在多个ISA上测试会很好,因为编译时重新排序可能会暴露或隐藏问题。(在x86上,这是一个更大的问题,因为每个存储都是一个发布存储,您只需要为存储负载重新排序设置一个障碍。而实际的x86实现往往超越了官方的x86规则,并提供了未记录的保证,以避免破坏重要的遗留代码(主要是Windows)。@PeterCordes如果我针对的是PowerPC,编译器使用获取/释放原子操作的代码,编译器不会生成比获取/释放原子操作导致更强内存同步的指令,因为在PowerPC上不可能生成这种语义吗?正如您所说,ARM提供了更弱的语义。因此,在这样的体系结构上,C11原子的任何适当实现都应该能够通过合理的优化来实现

acq_rel
语义,让您探索在x86上永远不会遇到的代码路径。@Oliv:PowerPC对不同类型的障碍有单独的说明。ARM64具有实际的获取加载和释放存储指令。(包括LL/SC版本,因此它可以实现
mo\u acq\u rel
)。如果可能的话,我建议在这两方面都进行测试!(而且不仅仅是一个虚拟机模拟器/仿真器,除非它是一个专门为模拟内存重新排序而编程的模拟器。)IDK if DEC Alpha硬件仍然可用,并由现代版本的编译器支持;你可能会发现编译器错误。C和C++规范使用抽象模型来存储内存和CPU。不必存在遵循该抽象模型的现有(旧的或新的)处理器。PowerPC是出了名的弱有序处理器,因此它可能是一个很好的ISA测试平台。如果可能的话,使用多个编译器在多个ISA上测试会很好,因为编译时重新排序可能会暴露或隐藏问题。(在x86上,这是一个更大的问题,因为每个存储都是一个发布存储,您只需要为存储负载重新排序设置一个障碍。而实际的x86实现往往超越了官方的x86规则,并提供了未记录的保证,以避免破坏重要的遗留代码(主要是Windows)。@PeterCordes如果我针对的是PowerPC,编译器使用获取/释放原子操作的代码,编译器不会生成比获取/释放原子操作导致更强内存同步的指令,因为在PowerPC上不可能生成这种语义吗?正如您所说,ARM提供了更弱的语义。因此,在这样的体系结构上,C11原子的任何适当实现都应该能够通过合理的优化来实现
acq_rel
语义,让您探索在x86上永远不会遇到的代码路径。@Oliv:PowerPC对不同类型的障碍有单独的说明。ARM64具有实际的获取加载和释放存储指令。(包括LL/SC版本,因此它可以实现
mo\u acq\u rel
)。如果可能的话,我建议在这两方面都进行测试!(而且不仅仅是一个虚拟机模拟器/仿真器,除非它是一个专门为模拟内存重新排序而编程的模拟器。)IDK if DEC Alpha硬件仍然可用,并由现代版本的编译器支持;您最终可能会发现编译器错误。