我正在为我的并行OpenMP C代码寻找执行时间的解决方案


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; 
}
}
}
}

。。。。。。。我使用2个线程来编写并行代码、DevCpp程序和OpenMP。我的并行OpenMP C代码运行速度与串行代码相同或慢得多!有什么解决办法吗?

引入同步总是有开销的。但你只需要这个,因为你正试图节省几个操作。问问自己,当你有几十个核心来并行工作时,节省2个工作的因素重要吗?

因此,也许您应该让代码在标量方面更加浪费,这意味着所有i,j都需要计算力,但更容易并行化。

最新更新