OpenMP基于某些条件是关键的

时间:2018-03-24 10:05:43

标签: openmp

我很确定我的问题措辞不够,不确定如何说出来。也许更有经验的人可以编辑我的问题描述,以便其他人更容易理解。

我有一个整数数组,比如int x[5000]和几个对这个数组执行操作的线程。例如,假设每个线程将循环遍历此数组的元素,并将每个条目递增1.

我想防止竞争条件,也就是说,两个线程不应该同时写入阵列中的同一个元素。他们可以同时写入数组的不同的元素,但不能写入相同的元素。我可以使用如下的OpenMP块:

#pragma omp parallel
{
    for (int i = 0 ; i < x.size(); i++){
        #pragma omp critical
        {
            x[i] += 1;
        }
    }
}

这段代码的问题在于它不允许不同的线程写入不同的元素,即使我想允许线程能够这样做(因为数组条目彼此独立)。是否有一些OpenMP结构可以使线程一次允许写入数组的不同条目,但不能同时写入相同的特定条目?

如果有人可以向我推荐一个类似的问题(不确定搜索什么),那也值得赞赏。

1 个答案:

答案 0 :(得分:1)

执行所描述内容的正确方法是

#pragma omp parallel for
for (int i = 0 ; i < x.size(); i++) {
        x[i] += 1;
}

这会自动拆分循环并为每个线程赋予自己的i值。你必须要小心,因为你仍然可以很容易地引入竞争条件。

#pragma omp parallel for
for (int i = 1 ; i < x.size(); i++) {
        x[i] += x[i-1]; //race
}

假设ThreadA正在进行迭代,其中i = 2和ThreadB正在处理i = 3的迭代。 ThreadA和ThreadB同时访问x[2],正如您所指出的那样糟糕。

程序员必须确保您的OpenMP代码无竞争。没有任何自动保护代码安全的方法。