在 openMP C++ 中并行化许多嵌套 for 循环

2024-04-12

你好,我是 C++ 新手,我编写了一个可以运行的代码,但是由于许多嵌套的 for 循环,它很慢,我想通过 openmp 来加速它,任何可以指导我的人。我尝试使用'#pragma omp 并行' 前ip循环并在这个循环中我使用了'#pragma omp 并行 for' 前it循环但不起作用

    #pragma omp parallel
    for(int ip=0; ip !=nparticle; ip++){
        inf14>>r>>xp>>yp>>zp;
        zp/=sqrt(gamma2);
        counter++;
        double para[7]={0,0,Vz,x0-xp,y0-yp,z0-zp,0};
        if(ip>=0 && ip<=43){
             #pragma omp parallel for
             for(int it=0;it<NT;it++){  
             para[6]=PosT[it];
                for(int ix=0;ix<NumX;ix++){
                    para[3]=PosX[ix]-xp;
                    for(int iy=0;iy<NumY;iy++){
                        para[4]=PosY[iy]-yp;
                        for(int iz=0;iz<NumZ;iz++){
                            para[5]=PosZ[iz]-zp;
                            int position=it*NumX*NumY*NumZ+ix*NumY*NumZ+iy*NumZ+iz;
                            rotation(para,&Field[3*position]);
                            MagX[position] +=chg*Field[3*position];
                            MagY[position] +=chg*Field[3*position+1];
                            MagZ[position] +=chg*Field[3*position+2];
                        }   
                    }
                }
            }   
        }
    }enter code here

我的旋转函数也具有循环的无限积分,如下所示

for(int i=1;;i++){
    gsl_integration_qag(&F, 10*i, 10*i+10, 1.0e-8, 1.0e-8, 100, 2, w, &temp, &error);
    result+=temp;
    if(abs(temp/result)<ACCURACY){
        break;
    }
}

我也在使用 gsl 库。那么如何加速这个过程或者如何制作openmp?


如果您没有循环间依赖性,则可以使用collapse关键字来并行化多个循环。例子:

void scale( int N, int M, float A[N][M], float B[N][M], float alpha ) {
  #pragma omp for collapse(2)
  for( int i = 0; i < N; i++ ) {
    for( int j = 0; j < M; j++ ) {
      A[i][j] = alpha * B[i][j];
    }
  }
}

我建议你看看OpenMP C/C++ 备忘单 (PDF) http://www.openmp.org/wp-content/uploads/OpenMP-4.5-1115-CPP-web.pdf,其中包含循环并行化的所有规范。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 openMP C++ 中并行化许多嵌套 for 循环 的相关文章

随机推荐