相关疑难解决方法(0)

使用OpenMP原子操作进行获取和添加

我正在使用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)

(如果我没有弄错的话,可以要求一个等价的问题进行比较和交换,但可以用另一个来实现.)

c++ atomic openmp compare-and-swap

8
推荐指数
1
解决办法
6046
查看次数

标签 统计

atomic ×1

c++ ×1

compare-and-swap ×1

openmp ×1