HP-UX Itanium比较和交换
HP-UX Itanium Compare and Swap
我正在开发C/c++跨平台代码,最后一个平台是基于Itanium的HP-UX。相关的机器和处理器信息可以在问题的末尾找到。
我需要为下面给出的机器和编译器规范实现或找到原子比较和交换。
我已经找到了一些可能的解决方案,但还没能找到如何使用它们。
第一个可能的解决方案是通过使用_Asm_cmpxchg(这里的文档)。我找不到要包含的头文件,也找不到如何让它编译。第二个可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写我自己的内联程序集,但我也没能找到如何正确地做到这一点。我找到了各种各样的资源,其中大多数都是直接编写汇编,不适合我需要的处理器体系结构,或者没有显示足够具体的示例。
我在这里找到了更多关于cmpxchg和cmpxchg8指令的文档(以及tzcnt和lzcnt,这两个是很好的,但不是必需的)。如果您在谷歌浏览器中查看,cmpxchg的绝对页面值为234,cmpxchg8的绝对页面值为236。
限制:由于超出我控制的约束,我无法使用第三方库。
uname -smr: HP-UX B.11.31 ia64
处理器型号: Intel(R) Itanium(R) Processor 9340
编译器- v: aCC:惠普C/aC + + B3910B A.06.28
更新:我能够得到_Asm_cmpxchg编译,但它似乎不起作用(值保持不变)。对于参数,我为_Asm_sz传递了_SZ_W,为_Asm_sem传递了_SEM_ACQ,为_Asm_ldhint传递了_LDHINT_NONE,为r3传递了一个指向原始32位整数值的指针,为r2传递了所需的新值。我在猜测参数的含义,因为文档非常平淡。
我最终自己找到了解决方案,使用了选项1。下面是让它工作的示例代码:
bool compare_and_swap(unsigned int* var, unsigned int oldval, unsigned int newval)
{
// Move the old value into register _AREG_CCV because this is the register
// that var will be compared against
_Asm_mov_to_ar(_AREG_CCV, oldval);
// Do the compare and swap
return oldval == _Asm_cmpxchg(
_SZ_W /* 4 byte word */,
_SEM_ACQ /* acquire the semaphore */,
var,
newval,
_LDHINT_NONE /* locality hint */);
}
相关文章:
- shell排序中的交换和比较
- 不正确的比较和交换计数器输出用于快速排序功能
- 原子值的部分比较和完全交换
- 跟踪选择排序中的交换和比较次数
- 如何在C 中实施简单的比较和交换共享计数器
- 为什么比较和交换操作同时存在免费函数和成员函数?
- 计数交换/比较合并排序算法的数字
- 通过比较数组中的相邻元素来计算交换次数
- 使用C++原子库,我应该使用什么样的内存顺序进行加载,然后进行比较交换
- 128位比较和交换固有
- std::atomic<int*>::load 应该做一个比较和交换循环吗?
- 互锁。比较交换<Int> 使用大于或小于而不是相等
- 如何将比较和交换用于任何共享数据结构的免等待互斥
- 你能用lambda比较器交换std::队列吗
- C++11比较和交换获取/释放语义
- 原子比较运算符(无交换)
- C++中比较和交换
- 比较和交换三个原子变量
- 如何在C++中获取快速排序的移动,交换和比较计数
- 在 x86 CPU 上进行比较和交换