gpt4 book ai didi

c++ - 在 C++ 中使用 openmp 对数组进行并行求和

转载 作者:太空狗 更新时间:2023-10-29 21:22:03 25 4
gpt4 key购买 nike

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

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

最佳答案

第一个 for 循环应该与第三个类似。

关于 sum 的一个小问题是 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;

对于第四个,您可能可以使用类似的技巧。

关于c++ - 在 C++ 中使用 openmp 对数组进行并行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385974/

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