gpt4 book ai didi

c - OpenMP:重写 for 循环以便可以并行化?

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:19 25 4
gpt4 key购买 nike

我正在尝试并行化可以找到的 FEM1D 代码 here .相关的部分是:

for ( i = 1; i < nu - 1; i++ )
{
adiag[i] = adiag[i] - aleft[i] * arite[i-1];
arite[i] = arite[i] / adiag[i];
}

简单地添加

 #pragma omp parallel for

在循环不起作用之前,我不确定为什么。我认为这是因为其他线程需要更新数组,但由于我是私有(private)的,所以线程不需要更新另一个线程所需的任何内容?

我已经尝试创建新变量并将它们设为私有(private),但我很确定它与更新 adiag 和 arite 数组有关,所以我尝试了 flush 指令,该指令指定所有线程对所有共享对象具有相同的内存 View ,但是再次没有骰子。

#pragma omp parallel for private(i,ad,al,ar)
for ( i = 1; i < nu - 1; i++ )
{
#pragma omp flush(adiag, arite, aleft)
ad = adiag[i];
al = aleft[i];
ar = arite[i-1];
adiag[i] = ad - al * ar;
ar = arite[i];
ad = adiag[i];
arite[i] = ar / ad;
}

所以我很困在这里,任何能帮助我的建议都将不胜感激。

编辑:by 不起作用我的意思是数组 adiag 和 arite 在循环完成后被错误填充

EDIT2:我得到了可以使用的循环

#pragma omp parallel for ordered
for ( i = 1; i < nu - 1; i++ )
{
#pragma omp ordered
adiag[i] = adiag[i] - aleft[i] * arite[i-1];
arite[i] = arite[i] / adiag[i];
}

但我认为这有点违背了并行化循环的初衷

最佳答案

我不认为你可以转换这个循环。您具有循环数据依赖性。通常当你有一个可以转换的循环时,你交换命令顺序并像这样解决你的循环问题:

for ( i = 1; i < nu - 1; i++ )
{
arite[i-1] = arite[i-1] / adiag[i-1];
adiag[i] = adiag[i] - aleft[i] * arite[i-1];
}

不过,当您这样做时,您需要使用由另一个线程计算的值。虽然我可能是错的......

关于c - OpenMP:重写 for 循环以便可以并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741015/

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