cod*_*ons 103 atomic openmp critical-section
OpenMP中的原子和关键有什么区别?
我可以做这个
#pragma omp atomic
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
但是不一样
#pragma omp critical
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
?
Jon*_*rsi 164
对g_qCount的影响是相同的,但所做的是不同的.
OpenMP临界区是完全通用的 - 它可以包围任意代码块.但是,每次线程进入和退出临界区时(除了序列化的固有成本之外),都会因此产生大量开销.
(此外,在OpenMP中,所有未命名的关键部分都被认为是相同的(如果您愿意,所有未命名的关键部分只有一个锁),因此,如果一个线程位于上面的一个[未命名]临界区中,则没有任何线程可以进入任何[未命名]关键部分.正如您可能猜到的那样,您可以通过使用命名的关键部分来解决这个问题.
原子操作的开销要低得多.在可用的情况下,它利用提供(比如说)原子增量操作的硬件; 在这种情况下,进入/退出代码行时不需要锁定/解锁,它只是硬件告诉你的原子增量不会受到干扰.
好处是开销要低得多,并且原子操作中的一个线程不会阻止任何(不同的)原子操作即将发生.缺点是原子支持的有限操作集.
当然,在任何一种情况下,都会产生序列化的成本.
Mic*_*ael 27
在OpenMP中,所有未命名的关键部分都是互斥的.
关键和原子之间最重要的区别是原子只能保护单个赋值,您可以将它与特定运算符一起使用.
小智 16
关键部分:
可以通过正确使用"name"标记扩展到序列化块组.
慢点!
原子操作:
快得多!
仅确保特定操作的序列化.
小智 7
最快的方法既不重要也不原子.大约,添加临界部分比简单添加贵200倍,原子添加比简单添加贵25倍.
最快的选择(并不总是适用)是为每个线程提供自己的计数器,并在需要总和时进行减少操作.