在C ++中用openmp并行求和数组

时间:2014-01-27 16:21:32

标签: c++ for-loop openmp

我在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是一个数组,我在编译时遇到错误。

有人可以给我一个提示,因为这是我代码中的一大瓶颈吗?

1 个答案:

答案 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;

第四个你可以使用类似的技巧。