我正在做一些图像处理并且有一个嵌套的for循环。我想使用OpenMP实现多处理。 for循环看起来像这样,我在其中添加了pragma标签,并将一些变量声明为私有。
int a,b,j, idx;
#pragma omp parallel for private(b,j,sumG,sumGI)
for(a = 0; a < ny; ++a)
{
for(b = 0; b < nx; ++b)
{
idx = a*ny+b;
if (imMask[idx] == 0)
{
Wshw[idx] = 0;
continue;
}
sumG = 0;
sumGI = 0;
for(j = a; j < ny; ++j)
{
sumG += shadowM[j-a];
sumGI += shadowM[j-a] * imBlurred[nx*j + b];
}
Wshw[idx] = sumGI / sumG;
}
}
nx和ny的大小都很大,我认为,使用OpenMP,我会得到执行时间的下降,而几乎没有差别。当我实现多线程时,我做错了吗?
答案 0 :(得分:2)
你在idx
中有种族条件。你也需要私密化。
然而,你可以试试这样的事情。
int a,b,j, idx;
#pragma omp parallel for private(a,b,j,sumG,sumGI)
for(idx=0; idx<ny*nx; ++idx) {
if (imMask[idx] == 0)
{
Wshw[idx] = 0;
continue;
}
sumG = 0;
sumGI = 0;
a=idx/ny;
b=idx%ny;
for(j = a; j < ny; ++j) {
sumG += shadowM[j-a];
sumGI += shadowM[j-a] * imBlurred[nx*j + b];
}
Wshw[idx] = sumGI / sumG;
}
你或许可以简单地使用内部循环以及idx的功能而不是a和b。