【发布时间】:2011-05-01 09:33:59
【问题描述】:
我正在使用 OpenMP,需要使用 fetch-and-add 操作。但是,OpenMP 没有提供适当的指令/调用。我想保持最大的可移植性,因此我不想依赖编译器内在函数。
相反,我正在寻找一种方法来利用 OpenMP 的原子操作来实现这一点,但我遇到了死胡同。这甚至可以做到吗?注意,以下代码几乎可以满足我的要求:
#pragma omp atomic
x += a
几乎——但不完全是,因为我真的需要x 的旧值。 fetch_and_add 应定义为产生与以下相同的结果(仅非锁定):
template <typename T>
T fetch_and_add(volatile T& value, T increment) {
T old;
#pragma omp critical
{
old = value;
value += increment;
}
return old;
}
(如果我没记错的话,可以询问比较和交换的等效问题,但可以根据另一个问题来实现。)
【问题讨论】:
-
只是说
atomic并不是它的名字所承诺的那样,因为任何内存被atomic(在任何其他线程上)修改的线程都需要重新-缓存。如此频繁和重复的atomic可能会影响您的性能(最好使用锁和缓冲竞速写入)。 -
@Walter 这也是我凭经验发现的:无锁算法的性能与使用锁的等效算法相当。无锁算法使用复杂得多的同步——不是在性能方面,而是在逻辑方面(因此有机会引入错误)。
标签: c++ atomic openmp compare-and-swap