![]() |
1
4
从openmp 3.1开始,支持捕获原子更新,您可以捕获旧值或新值。因为我们必须从内存中引入值来增加它,所以我们应该能够从一个CPU寄存器访问它并将它放入一个线程私有变量中。 如果使用gcc(或g++),可以找到原子内置: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html 它认为英特尔的C/C++编译器也支持这一点,但我没有尝试过。
更新:我刚试用了英特尔的C++编译器,它目前支持OpenMP 3.1(实现原子捕获)。英特尔提供在linux中免费使用编译器的非商业用途: http://software.intel.com/en-us/articles/non-commercial-software-download/ GCC4.7将支持OpenMP3.1,当它最终发布时。。。希望很快:) |
![]() |
2
2
更新:这不是一个真正的答案,因为x可以被另一个线程在原子之后修改。 因此,似乎不可能使用OMP Pragmas实现通用的“Fetch and add”。作为通用的,我指的是操作,它可以很容易地从OMP代码的任何地方使用。
你可以用
typedef struct{omp_lock_t lock;int value;}模拟原子结构;
这是丑陋和缓慢的(做一个2原子操作而不是1)。但是如果你希望你的代码是非常可移植的,那么它并不是所有情况下最快的。 你说“如下(仅限非锁定)”。但“非锁定”操作(使用CPU的“LOCK”前缀,或LL/SC等)和锁定操作(使用多个原子指令自行实现,忙循环用于短时间等待解锁,操作系统睡眠用于长时间等待)之间有什么区别? |
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 4 月前 |