我很确定我的问题措辞不够,不确定如何说出来。也许更有经验的人可以编辑我的问题描述,以便其他人更容易理解。
我有一个整数数组,比如int x[5000]
和几个对这个数组执行操作的线程。例如,假设每个线程将循环遍历此数组的元素,并将每个条目递增1.
我想防止竞争条件,也就是说,两个线程不应该同时写入阵列中的同一个元素。他们可以同时写入数组的不同的元素,但不能写入相同的元素。我可以使用如下的OpenMP块:
#pragma omp parallel
{
for (int i = 0 ; i < x.size(); i++){
#pragma omp critical
{
x[i] += 1;
}
}
}
这段代码的问题在于它不允许不同的线程写入不同的元素,即使我想允许线程能够这样做(因为数组条目彼此独立)。是否有一些OpenMP结构可以使线程一次允许写入数组的不同条目,但不能同时写入相同的特定条目?
如果有人可以向我推荐一个类似的问题(不确定搜索什么),那也值得赞赏。
答案 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代码无竞争。没有任何自动保护代码安全的方法。