omp 原子写入如何工作?

问题描述 投票:0回答:1

我面临着 ompatomic 的一些问题。 简而言之,我正在尝试编写一种在多线程环境中更新某些计数器的算法。为此,我正在利用 ompatomic。 从我围绕这些概念进行的测试中,我注意到 ompatomic write 比 ompatomic 快得多。这是因为 ompatomic 会锁定读取和写入,因此速度较慢。我的问题是,当使用 ompatomic write 时,我丢失了更新。我不确定这是否是因为我的代码中存在其他一些错误,或者是因为 omp 原子写入的工作方式。 有人可以解释一下 ompatomic write 是如何工作的以及它是否可以保证使用时不会丢失更新?

c++ multithreading parallel-processing openmp atomic
1个回答
0
投票

所以我的问题是在用于更新共享计数器时找到 #pragma ompatomic 和 #pragma ompatomic write 之间的区别。

这就是我阅读的结果: 当您更新计数器时,会发生 3 件事:

1-读取计数器的值

2-增加计数器(考虑到我们的更新包括 增量)

3-写回新值

当同时使用多个线程时,不能保证这 3 个操作的执行不会中断,这会导致您的容器丢失更新和未指定的行为。

为了解决这个问题,使用了#pragma ompatomic。它使这 3 个操作的执行成为原子的。这意味着它们不会被另一个线程中断。另一方面,#pragma ompatomic write 保证只有步骤 3 是原子的,并且对步骤 1 和 2 没有任何说明。因此,#pragma ompatomic write 不适合更新共享计数器。

在性能方面,#pragma omp 原子写入速度更快,因为它对共享变量的锁定较少。

© www.soinside.com 2019 - 2024. All rights reserved.