OpenMP:嵌套的 for 循环,执行时间几乎没有任何差异

OpenMP: Nested for-loop, barely any difference in execution time

本文关键字:执行时间 几乎没有 任何差 循环 嵌套 for OpenMP      更新时间:2023-10-16

我正在做一些图像处理,并且有一个嵌套的for循环。我想使用 OpenMP 实现多处理。for 循环如下所示,我在其中添加了杂注标签并声明了一些私有变量。

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,我会减少执行时间,相反几乎没有区别。当我实现多线程时,我做错了什么吗?

你在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。