使用 omp 线程的两种相等并行方式之间的实际差异

Actual dIfference between 2 ways of equal parallelism using omp threads

我正在尝试使用 OMP 线程并行化我的程序。

我正在做的是以下内容,并且效果很好:

 #pragma omp parallel num_threads(threadnum) \
default(none) shared(scoreBoard, nDiag, qlength, dlength) private(nEle, i, si, sj, ai, aj, max)
        {
            for (i = 1; i < nDiag; ++i)
            {
                if (i <= qlength && i <= dlength) nEle = i;
                else if(i <= findmax(qlength, dlength)) nEle = findmin(qlength, dlength);
                else nEle = 2*findmin(qlength, dlength) - i + abs(qlength - dlength);
                calcfirstele(%si, %sj);

                #pragma omp for
                for (j = 1; j <= nEle; ++j)
                {
                    ai = si - j + 1;
                    aj = sj + j - 1

                    max = searchmax(ai,aj);
                    scoreBoard[ai][aj] = max;
                }
            }
        }

但它不等于:

        for (i = 1; i < nDiag; ++i)
        {
            if (i <= qlength && i <= dlength) nEle = i;
            else if(i <= findmax(qlength, dlength)) nEle = findmin(qlength, dlength);
            else nEle = 2*findmin(qlength, dlength) - i + abs(qlength - dlength);
            calcfirstele(%si, %sj);
             #pragma omp parallel num_threads(threadnum) \
            default(none) shared(scoreBoard) private(nEle, i, si, sj, ai, aj, max)
            #pragma omp for
            for (j = 1; j <= nEle; ++j)
            {
                ai = si - j + 1;
                aj = sj + j - 1

                max = searchmax(ai,aj);
                scoreBoard[ai][aj] = max;
            }
        }

为什么当我使用第二个程序时,我的程序比串行程序花费更多时间,而在第一种情况下它比串行程序运行得快得多?看不懂它们的区别

你的第二个代码是错误的并且有未定义的行为。 这样做的原因是通过声明 nElesisj private,您创建了这些变量的一些本地(每线程)版本,而没有给它们任何值.因此,nEle 值得注意的是,它是 for 循环的上限,可以具有任何值,可能会显着增加计算的长度。

为了修复您的代码,您提供的代码片段应如下所示(经过一些简化,显然未经过测试):

for (int i = 1; i < nDiag; ++i) {
    if (i <= qlength && i <= dlength)
        nEle = i;
    else if(i <= findmax(qlength, dlength))
        nEle = findmin(qlength, dlength);
    else
        nEle = 2*findmin(qlength, dlength) - i + abs(qlength - dlength);
    calcfirstele(%si, %sj); // not sure what this suppose to mean...

    #pragma omp parallel for num_threads(threadnum) private(ai, aj, max)
    for (int j = 1; j <= nEle; ++j) {
        ai = si - j + 1;
        aj = sj + j - 1

        max = searchmax(ai,aj);
        scoreBoard[ai][aj] = max;
    }
}