【发布时间】:2022-01-12 12:17:57
【问题描述】:
pos = calloc(nbodies, sizeof(*pos));
forces = calloc(nbodies, sizeof(*forces));
//...more...
printf("Calculating......\n");
ene = 0.0;
#pragma omp parallel shared(pos,forces,ene,i)
{
#pragma omp for private(j,k,d,d2,d3,rij)
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;
#pragma omp atomic
forces[j][k] -= f;
}
#pragma omp atomic
ene += -1.0/d;
}
}
}
}
。 . . . . . . . 我为我的并行代码和 DevCpp 程序和 OpenMP 使用 2 个线程。 我的并行 OpenMP C 代码以与串行代码相同或慢得多的速度运行!有什么解决办法吗?
【问题讨论】:
-
您可以对 ene 变量和数组使用归约子句,您可以为每个线程使用一个数组来避免 pragma omp atomic 的同步成本。然后在平行区域之外将力减少到单个阵列中。
-
虚假共享可能也无济于事,因此最好处理
forces数组的本地副本,然后执行缩减以更快。 -
换句话说,你应该对
ene和forces使用归约来代替原子。无需手动创建本地数组,因为这正是归约所要做的。 -
@Qubit 是的,完全类似于 github.com/dreamcrash/ScholarShipCode/blob/…
标签: c parallel-processing openmp false-sharing