gpt4 book ai didi

c++ - OpenMP 从并行 for 循环调用并行函数

转载 作者:行者123 更新时间:2023-11-30 03:38:57 25 4
gpt4 key购买 nike

我正在尝试有一个并行区域,它内部首先有一个并行 for,然后是内部有一个并行 for 的函数调用,最后是另一个并行 for。

一个简化的例子可能是这样的

#pragma parallel
{
#pragma omp for
for(int i=0;i<1000;i++)
position[i]+=velocity[i];

calculateAccelerationForAll();

#pragma omp for
for(int i=0;i<1000;i++)
velocity[i]+=acceleration[i];
}

calculateAccelerationForAll()
{
#pragma parallel omp for
for(int i=0;i<1000;i++)
for(int j=0;j<1000;j++)
acceleration[i]=docalculation
}

这里的问题是我希望现有线程跳转到 calculateAccelerationForAll 并在那里执行 for 循环,而不是拥有三个独立的并行区域。我可以确保只有第一个线程实际调用函数,并且在函数调用之后有一个屏障,但只有那个线程在函数内部执行 for 循环。

真正的问题是,如果我的假设(将第一个和最后一个循环放在它们自己的平行区域中并使函数调用也有自己的区域)是低效的,是错误的......或者如果它是正确的,如何然后我可以让一个区域线程一直通过它。

可能会补充一点,如果我只是将函数的内容放入两个现有循环之间的主要并行区域中,那么这将不是问题。问题(至少对我而言)是我必须使用函数调用,然后 make 也并行运行。

最佳答案

它似乎有助于解决问题。显而易见的答案是更改函数中的 pragma从 #pragma parallel for#pragma for这使得 for 循环使用 existing 调用并行部分中的 existing 线程,并且它工作得很好。

关于c++ - OpenMP 从并行 for 循环调用并行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179673/

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