gpt4 book ai didi

c - OpenMP 嵌套循环,代码在做什么?

转载 作者:行者123 更新时间:2023-11-30 14:22:42 27 4
gpt4 key购买 nike

我在理解 OpenMP 如何使用嵌套循环时遇到问题。请帮忙!

我得到了以下并行运行的代码:

#pragma omp parallel private(i)
{
for(i=0; i<n; i++)
{
#pragma omp for
for(j=0; j<n; j++)
{
if(asubsref(seed,j) > 0)
asubsref(bin,j) = asubsref(bin,j) + 1;
}
#pragma omp for
for(j=0; j<n; j++)
asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i);
}
}

但是,我不太确定这段代码是如何工作的(我只是幸运地得到了它)。这就是我认为它正在做的事情......

所以for(i=0; i<n; i++)被分成不同的线程并并行运行。因为i被声明为private ,循环的每个实例都是“沙盒”的;也就是说,对 j 的任何更改保留在该线程中(至少直到所有线程都完成为止?)。我很困惑,因为没有声明 #pragma omp for导致代码中断...我不知道为什么会这样。

如果有人可以引导我完成这段代码的用途,我将非常感激!谢谢!

最佳答案

这是人们通常所做的事情,以减少多次进入和存在于并行区域和离开并行区域的开销。将您的问题中的代码与以下等效代码进行比较:

for (i=0; i<n; i++)
{
#pragma omp parallel for
for (j=0; j<n; j++)
{
if (asubsref(seed,j) > 0)
asubsref(bin,j) = asubsref(bin,j) + 1;
}
#pragma omp parallel for
for (j=0; j<n; j++)
asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i);
}

它运行外循环 i n 次。在外循环的每次迭代中,它在 j 上运行两个并行循环,在线程之间拆分 n 迭代。这里的问题是内部有两个并行区域,每个区域都被激活n次。这可能会显着增加 n 值的特定间隔的开销(实际间隔取决于许多因素)。

为了减少开销,将整个代码放在一个并行区域中。因此,每个线程将执行外循环的所有迭代,而内迭代仍将在线程之间分割。如果删除工作共享构造,则内部循环将不会在线程之间分配。相反,每个线程都会执行完整范围的外部内部迭代,因此例如asubsref(bin,j)将增加到num_threads code> 次而不是一次(为什么“最多”?提示:不 protected 并发数据访问)。

大多数时候,当人们在并行构造中运行外部循环时,人们希望不同的线程在相同的迭代上保持运行。这可以通过循环体末尾的屏障来实现:

#pragma omp parallel private(i)
{
for (i = 0; i < n; i++)
{
...
#pragma omp barrier
}
}

在您的情况下,不需要显式屏障,因为 for 工作共享构造在其末尾有一个隐式屏障。

关于c - OpenMP 嵌套循环,代码在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577949/

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