gpt4 book ai didi

c++ - pragma omp for inside pragma omp master or single

转载 作者:太空狗 更新时间:2023-10-29 20:28:03 27 4
gpt4 key购买 nike

我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的:

#pragma omp parallel default(none) shared(mat,mat2,f,max_iter,tol,N,conv) private(diff,k)
{
#pragma omp master // I'm not against using #pragma omp single or whatever will work
{
while(diff>tol) {
do_work(mat,mat2,f,N);
swap(mat,mat2);
if( !(k%100) ) // Only test stop criteria every 100 iteration
diff = conv[k] = do_more_work(mat,mat2);
k++;
} // end while
} // end master
} // end parallel

do_work 取决于之前的迭代,因此 while 循环必须按顺序运行。但我希望能够并行运行“do_work”,所以它看起来像:

void do_work(double *mat, double *mat2, double *f, int N)
{
int i,j;
double scale = 1/4.0;
#pragma omp for schedule(runtime) // Just so I can test different settings without having to recompile
for(i=0;i<N;i++)
for(j=0;j<N;j++)
mat[i*N+j] = scale*(mat2[(i+1)*N+j]+mat2[(i-1)*N+j] + ... + f[i*N+j]);
}

我希望这可以通过某种方式实现,我只是不确定如何实现。所以非常感谢我能得到的任何帮助(如果你告诉我这是不可能的)。顺便说一句,我正在使用 open mp 3.0、gcc 编译器和 sun studio 编译器。

最佳答案

原始代码中的外部并行区域仅包含串行部分 (#pragma omp master),这没有任何意义并有效地导致纯串行执行(无并行性)。由于 do_work() 依赖于之前的迭代,但是你想并行运行它,你必须使用同步。 openmp 工具是一个(显式或隐式)同步屏障。

例如(代码类似于你的):

#pragma omp parallel
for(int j=0; diff>tol; ++j) // must be the same condition for each thread!
#pragma omp for // note: implicit synchronisation after for loop
for(int i=0; i<N; ++i)
work(j,i);

请注意,如果任何线程仍在处理当前 j,则隐式同步可确保没有线程进入下一个 j

另一种选择

for(int j=0; diff>tol; ++j)
#pragma omp parallel for
for(int i=0; i<N; ++i)
work(j,i);

应该效率较低,因为它会在每次迭代时创建一个新的线程组,而不仅仅是同步。

关于c++ - pragma omp for inside pragma omp master or single,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14384959/

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