第一种方法(并行化内部循环):
for(j=0; j<LATTICE_VW; ++j) {
x = j*DX + LATTICE_W;
#pragma omp parallel for ordered private(y, prob)
for(i=0; i<LATTICE_VH; ++i) {
y = i*DY + LATTICE_S;
prob = psi[i][j].norm();
#pragma omp ordered
out << x << " " << y << " " << prob << endl;
}
}
第二种方法(并行化外部循环):
#pragma omp parallel for ordered private(x, y, prob)
for(j=0; j<LATTICE_VW; ++j) {
x = j*DX + LATTICE_W;
for(i=0; i<LATTICE_VH; ++i) {
y = i*DY + LATTICE_S;
prob = psi[i][j].norm();
#pragma omp ordered
out << x << " " << y << " " << prob << endl;
}
}
第三种方法(并行化折叠循环)
#pragma omp parallel for collapse(2) ordered private(x, y, prob)
for(j=0; j<LATTICE_VW; ++j) {
for(i=0; i<LATTICE_VH; ++i) {
x = j*DX + LATTICE_W;
y = i*DY + LATTICE_S;
prob = psi[i][j].norm();
#pragma omp ordered
out << x << " " << y << " " << prob << endl;
}
}
如果要我猜的话,我会说方法3应该是最快的。
然而,方法1是最快的,而第二种和第三种方法所用的时间大致相同,就好像没有并行化一样。为什么会出现这种情况?
1条答案
按热度按时间a2mppw5e1#
看看这个:
您拥有:
每个线程只需要等待一些
cout
所有的工作就可以并行完成了.但是用:和
情况是:
因此,
thread 1
必须等待thread 0
完成其所有工作,然后才能第一次执行cout
,并且几乎无法并行执行任何操作。尝试将
schedule(static,1)
添加到collapse-version中,它的性能应该至少与第一个版本一样好。