我使用二维矢量。我有两个操作:
使用(i,j)将项目添加到向量
我怎样才能平行化这段代码?如果我只添加#pragma omp parallel for shared(tempVector, objVector)
,那么OpenMP可以阻止日期竞争吗?
vector < myObject > objVector;
vector< vector <int> > tempVector(4);
for(int i = 0; i < objVector.size(); i++) {
int x = objVector[i].X,
y = objVector[i].Y;
if(x <= Xmiddle+DIAMETER && y <= Ymiddle+DIAMETER)
{
tempVector[0].push_back(i);
}
if(x >= Xmiddle-DIAMETER && y <= Ymiddle+DIAMETER)
{
tempVector[1].push_back(i);
}
if(x <= Xmiddle+DIAMETER && y >= Ymiddle-DIAMETER)
{
tempVector[2].push_back(i);
}
if(x >= Xmiddle-DIAMETER && y >= Ymiddle-DIAMETER)
{
tempVector[3].push_back(i);
}
}
答案 0 :(得分:1)
您需要使用#critical指令正确访问共享变量:
#include <omp.h>
main()
{
int x;
x = 0;
#pragma omp parallel shared(x)
{
#pragma omp critical
x = x + 1;
} /* end of parallel section */
}
示例摘自:https://computing.llnl.gov/tutorials/openMP/#CRITICAL
如果我是你,我会想到不同的东西(不幸的是,在这种情况下你不能使用#reduction,但你肯定可以重新洗牌以获得相同的结果)。
答案 1 :(得分:0)
不幸的是,在这种情况下,OpenMP无法阻止数据竞争。 shared子句允许所有线程查看向量变量,但它不会对它们的访问进行排序。 Vector的push_back函数不是线程安全的,因为它可能导致向量的底层存储重新分配(增长)。
此代码可以并行化,但它的扩展程度取决于您愿意投入多少实施工作量。要确定适当的工作量,请确定此部分占用整个应用程序的时间。以下是两种(很多可能的)并行化问题的方法: