我在C ++中有一个for循环需要花费大量的计算时间,并且我想通过使用OpenMP进行并行化(我有16个核心可用)。我的代码的其他更简单的for循环和FFT已经与OpenMP并行化并且工作正常。我已经尝试了一些选项,但结果没有(数量级差异),就像串行计算的那样。
我的相应代码部分看起来基本如下:
for (i1=1;i1<N;i1++){
function(Nx, Ny, i1, k, vector_1, vector_2);
for (i=0;i<(Nx*Ny);i++){
vector_3[i] = I*kx[i/Ny]*vector_2[i];
}
for (i=0;i<(Nx*Ny);i++){
sum[i1-1] -= vector_2[i];
}
fftw_execute(p_c2r_4);
#pragma omp parallel for default(shared)
for (i=0;i<(Nx*Ny);i++){
vector_4[i] = vector_4[i]/norm;
}
for (i2=1;i2<N;i2++){
function(Nx, Ny, i2, k, vector_1, vector_2);
for (i=0;i<(Nx*Ny);i++){
Trans[(i1-1)*N + (i2-1)] -= creal( vector_2[i]*vector_4[i] );
}
}
}
其中一个for循环已经并行化了,所以我的目标是并行化其他循环。对于我看到其他人使用reduction(+:sum)
的总和,但在我的情况下sum
是一个数组,我在编译时遇到错误。
有人可以给我一个提示,因为这是我代码中的一大瓶颈吗?
答案 0 :(得分:3)
第一个for循环应该与第三个类似。
总和的一个小问题是sum []数组是使用第一个循环索引索引的,因此似乎混淆了编译器。为了使机器更容易,您可以尝试:
double subsum=0.0;
#pragma omp parallel for default(shared) reduction(+:subsum)
for (i=0;i<(Nx*Ny);i++){
subsum += vector_2[i];
}
sum[i1-1] -= subsum;
第四个你可以使用类似的技巧。