为什么OpenMP原子指令不支持赋值?

时间:2010-09-28 10:52:54

标签: parallel-processing atomic openmp

openmp中的原子指令支持

之类的东西
x += expr
x *= expr

其中expr是不引用x的标量类型的表达式。我明白了,但我不明白为什么你不能这样做:

#pragma omp atomic
x = y;

这在某种程度上更加令人费解cpu指令吗?在我看来,合法和非法语句都加载了x的值和一些其他标量值,改变了x的寄存器值并将其写回。如果有人能向我解释这些指示是如何(我假设)根本不同,我将非常感激。

1 个答案:

答案 0 :(得分:-1)

因为建议的原子赋值不能防止任何事情。

请记住,原子指令可以被认为是一个关键部分,可以(但不一定)由编译器通过使用魔术硬件有效地实现。考虑使用共享x = y和私有x达到y的两个主题。完成所有线程后,x等于执行“wins”的最后一个线程,并将x设置为y。将作业包装在关键部分并且没有任何变化,最后一个线程仍然“获胜”。现在,如果线程用x执行其他操作,之后最慢的线程可能没有赶上,即使它有编译器可能合法地最终使用选择x的某些缓存值(即线程的本地y)。为了避免这种情况,你需要一个障碍(因此获胜的线程赢了)及其隐含的刷新(因此本地缓存已经失效):

x = y;
#pragma omp barrier
\\ do something with shared x...

但我想不出这样做的好理由。为什么所有的工作都要在许多线程上查找,如果大多数线程被(非确定性地)扔掉?