![]() |
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等)和锁定操作(使用多个原子指令自行实现,忙循环用于短时间等待解锁,操作系统睡眠用于长时间等待)之间有什么区别? |
![]() |
Rasim Avcı · 如何履行承诺。解析需要原子化的代码 6 年前 |
![]() |
Lingxi · 真正测试std::atomic是否无锁 6 年前 |
![]() |
Rajeev Mehta · 修改和读取原子变量 6 年前 |
![]() |
Chris Jefferson · 在Rust中获得“无序”语义 7 年前 |
![]() |
Jérôme B · redis自动切换值 7 年前 |
![]() |
krimog · 更新where select,保证原子性 7 年前 |