作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
OpenMP 中原子和关键之间有什么区别?
我能做到
#pragma omp atomic
g_qCount++;
但这和
不一样吗#pragma omp critical
g_qCount++;
?
最佳答案
对 g_qCount 的影响是相同的,但所做的事情不同。
OpenMP 临界区是完全通用的 - 它可以包围任何任意代码块。然而,每次线程进入和退出关键部分时,您都会为这种通用性付出代价(除了序列化的固有成本之外)。
(此外,在 OpenMP 中,所有未命名的临界区都被视为相同(如果您愿意,所有未命名的临界区只有一把锁),因此,如果一个线程位于上述一个 [未命名] 临界区中,则没有线程可以输入任何[未命名]临界区。正如您可能猜到的,您可以通过使用命名临界区来解决这个问题。
原子操作的开销要低得多。在可用的情况下,它利用提供(例如)原子增量操作的硬件;在这种情况下,进入/退出代码行时不需要锁定/解锁,它只是执行原子增量,硬件告诉您不会受到干扰。
优点是开销要低得多,并且处于原子操作中的一个线程不会阻止任何即将发生的(不同的)原子操作。缺点是原子支持的操作集有限。
当然,无论哪种情况,您都会产生序列化的成本。
关于openmp - OpenMP 中的原子性和关键性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7798010/
我是一名优秀的程序员,十分优秀!