gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:40:52 25 4
gpt4 key购买 nike

我正在尝试使用 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,您可以创建一些本地的(per- thread)这些变量的版本,而不给它们任何值。因此,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;
}
}

关于c - 使用 omp 线程的两种相等并行方式之间的实际差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com