我正在使用OpenMP,需要使用fetch-and-add操作.但是,OpenMP不提供适当的指令/调用.我想保留最大的可移植性,因此我不想依赖编译器内在函数.
相反,我正在寻找一种方法来利用OpenMP的原子操作来实现这一点,但我已经走到了尽头.甚至可以这样做吗?注意,以下代码几乎可以满足我的需求:
#pragma omp atomic
x += a
Run Code Online (Sandbox Code Playgroud)
几乎 - 但不完全,因为我真的需要旧的价值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;
}
Run Code Online (Sandbox Code Playgroud)
(如果我没有弄错的话,可以要求一个等价的问题进行比较和交换,但可以用另一个来实现.)