我正在使用 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;
}
(如果我没记错的话,可以询问比较和交换的等效问题,但可以根据另一个问题来实现。)