【发布时间】:2014-02-18 14:14:35
【问题描述】:
我在 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 是一个数组,编译时出现错误。
谁能给我一个提示,因为这是我代码中的一个大瓶颈?
【问题讨论】:
-
你放了什么#pragmas?
-
好吧,我在每个循环中都尝试了
#pragma omp parallel for default(shared),但结果完全错误。然后我尝试将一些变量设为私有,例如private(i1,k,vector_1,vector_2),但这只是一次绝望的尝试,它也没有奏效。 -
乱用 schedule 子句。如果您的循环计数不是动态编译的常量或引导可能会更好。