OpenMP:嵌套for循环,执行时间差别不大

时间:2014-02-07 20:50:49

标签: c++ visual-c++ parallel-processing openmp

我正在做一些图像处理并且有一个嵌套的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,我会得到执行时间的下降,而几乎没有差别。当我实现多线程时,我做错了吗?

1 个答案:

答案 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。