我想要一个并行区域,其中首先是一个并行区域,然后是一个内部并行的函数调用,最后是另一个并行函数。
一个简化的例子可能就是这个
#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并行运行。
答案 0 :(得分:2)
它似乎帮助输入了问题。
显而易见的答案是改变函数中的pragma
从#pragma parallel for
到#pragma for
这使得for循环使用来自现有调用并行部分的现有线程,并且它完美地运行。