openmp中的原子指令支持
之类的东西x += expr
x *= expr
其中expr是不引用x的标量类型的表达式。我明白了,但我不明白为什么你不能这样做:
#pragma omp atomic
x = y;
这在某种程度上更加令人费解cpu指令吗?在我看来,合法和非法语句都加载了x的值和一些其他标量值,改变了x的寄存器值并将其写回。如果有人能向我解释这些指示是如何(我假设)根本不同,我将非常感激。
答案 0 :(得分:-1)
因为建议的原子赋值不能防止任何事情。
请记住,原子指令可以被认为是一个关键部分,可以(但不一定)由编译器通过使用魔术硬件有效地实现。考虑使用共享x = y
和私有x
达到y
的两个主题。完成所有线程后,x
等于执行“wins”的最后一个线程,并将x
设置为y
。将作业包装在关键部分并且没有任何变化,最后一个线程仍然“获胜”。现在,如果线程用x
执行其他操作,之后最慢的线程可能没有赶上,即使它有编译器可能合法地最终使用选择x
的某些缓存值(即线程的本地y
)。为了避免这种情况,你需要一个障碍(因此获胜的线程赢了)及其隐含的刷新(因此本地缓存已经失效):
x = y;
#pragma omp barrier
\\ do something with shared x...
但我想不出这样做的好理由。为什么所有的工作都要在许多线程上查找,如果大多数线程被(非确定性地)扔掉?