【发布时间】:2022-01-10 11:21:12
【问题描述】:
我想并行化 for 循环,但我似乎无法理解这个概念,每次我尝试并行化它们时它仍然有效,但速度显着减慢。
for(i=0; i<nbodies; ++i){
for(j=i+1; j<nbodies; ++j) {
d2 = 0.0;
for(k=0; k<3; ++k) {
rij[k] = pos[i][k] - pos[j][k];
d2 += rij[k]*rij[k];
if (d2 <= cut2) {
d = sqrt(d2);
d3 = d*d2;
for(k=0; k<3; ++k) {
double f = -rij[k]/d3;
forces[i][k] += f;
forces[j][k] -= f;
}
ene += -1.0/d;
}
}
}
}
在某些情况下,我尝试使用带屏障和关键的同步,但没有任何反应,或者处理根本没有结束。
更新,这就是我现在的状态。在没有崩溃的情况下工作,但计算时间越长,我添加的线程越多。 (锐龙 5 2600 6/12)
#pragma omp parallel shared(d,d2,d3,nbodies,rij,pos,cut2,forces) private(i,j,k) num_threads(n)
{
clock_t begin = clock();
#pragma omp for schedule(auto)
for(i=0; i<nbodies; ++i){
for(j=i+1; j<nbodies; ++j) {
d2 = 0.0;
for(k=0; k<3; ++k) {
rij[k] = pos[i][k] - pos[j][k];
d2 += rij[k]*rij[k];
}
if (d2 <= cut2) {
d = sqrt(d2);
d3 = d*d2;
#pragma omp parallel for shared(d3) private(k) schedule(auto) num_threads(n)
for(k=0; k<3; ++k) {
double f = -rij[k]/d3;
#pragma omp atomic
forces[i][k] += f;
#pragma omp atomic
forces[j][k] -= f;
}
ene += -1.0/d;
}
}
}
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
#pragma omp single
printf("Calculation time %lf sec\n",time_spent);
}
我在实际的并行代码中加入了计时器(我认为这种方式快了几毫秒)。此外,我认为我得到了大多数共享和私有变量的权利。在文件中输出力。
【问题讨论】:
-
如果您询问有关特定语言代码的问题,请不要标记其他语言。虽然它们看起来很相似,但 C 和 C++ 实际上是两种非常不同的语言。也请花一些时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。最后请学习如何edit您的问题以改进它们。
-
请发帖minimal reproducible example。上面的代码缺少声明以及您尝试并行化循环的方式。
标签: c parallel-processing openmp