我面临着 ompatomic 的一些问题。 简而言之,我正在尝试编写一种在多线程环境中更新某些计数器的算法。为此,我正在利用 ompatomic。 从我围绕这些概念进行的测试中,我注意到 ompatomic write 比 ompatomic 快得多。这是因为 ompatomic 会锁定读取和写入,因此速度较慢。我的问题是,当使用 ompatomic write 时,我丢失了更新。我不确定这是否是因为我的代码中存在其他一些错误,或者是因为 omp 原子写入的工作方式。 有人可以解释一下 ompatomic write 是如何工作的以及它是否可以保证使用时不会丢失更新?
所以我的问题是在用于更新共享计数器时找到 #pragma ompatomic 和 #pragma ompatomic write 之间的区别。
这就是我阅读的结果: 当您更新计数器时,会发生 3 件事:
1-读取计数器的值
2-增加计数器(考虑到我们的更新包括 增量)
3-写回新值
当同时使用多个线程时,不能保证这 3 个操作的执行不会中断,这会导致您的容器丢失更新和未指定的行为。
为了解决这个问题,使用了#pragma ompatomic。它使这 3 个操作的执行成为原子的。这意味着它们不会被另一个线程中断。另一方面,#pragma ompatomic write 保证只有步骤 3 是原子的,并且对步骤 1 和 2 没有任何说明。因此,#pragma ompatomic write 不适合更新共享计数器。
在性能方面,#pragma omp 原子写入速度更快,因为它对共享变量的锁定较少。