我试图使用C++并行化以下代码OpenMP:
int np = 1000000;
double kk = 1 / pow(2 * pi, 2);
for (int kes = 1; kes <= 100; kes++) {
double E1 = 0;
#pragma omp parallel for reduction(+: E1)
for (int ies = 0; ies < np; ies++) {
for (int jes = 0; jes < np; jes++) {
if (ies != jes) {
float distanes = sqrt(pow(xp[ies] - xp[jes], 2) + pow(yp[ies] - yp[jes], 2) + pow(zp[ies] - zp[jes], 2));
float distan = kes * distanes;
if (distan <= 5) {
float gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];
E1 = E1 + kk * gpspec * sin(kes * distanes) / (kes * distanes);
}
}
}
}
Ees[kes] = exp(-kes * pow(sp, 2) / 2) * E1;
}此代码是并行化的。然而,计算时间仍然很糟糕。如何用n^2运算来加快计算速度?xp、yp、zp、gpx、gpy、gpz是一维矢量.
发布于 2020-10-13 11:10:57
根据@paddy (put kes循环内部和jes=ies+1)的建议,我对代码进行了如下修改:
double kk = 1 / pow(2 * pi, 2);
int np = 1000000;
//#pragma omp parallel for reduction(+: E1)
for (ies = 0; ies < np; ies++){
for (jes = ies+1; jes < np; jes++){
double dxp = xp[ies] - xp[jes];
double dyp = yp[ies] - yp[jes];
double dzp = zp[ies] - zp[jes];
double distance = sqrt( dxp * dxp + dyp * dyp + dzp * dzp );
double gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];
for (kes = 1; kes <= 100; kes++){
double distance_thresh = 5.0/kes;
if (distance <= distance_thresh){
double distan = kes * distance;
E1[kes] = E1[kes] + gpspec * sin(distan) / distan;
}
}
}
#pragma omp parallel for
for (kes = 1; kes <= par_spec; kes++){
Ees[kes] = exp(-kes * pow(sp, 2) / 2) * E1[kes] * kk * 2.0f;
}看上去好多了。然而,如何并行化呢?
https://stackoverflow.com/questions/64330128
复制相似问题