我在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
是一个数组,并且在编译时出现错误。
有人能给我一些提示吗?因为这是我代码的一个很大瓶颈。
#pragma omp parallel for default(shared)
,但结果完全错误。然后我尝试将一些变量设为私有,例如private(i1,k,vector_1,vector_2)
,但这只是一种绝望的尝试,也没有起作用。 - Fortran_user