【发布时间】:2013-01-02 13:33:00
【问题描述】:
第一种方法(并行化内循环):
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 是最快的,而第二种和第三种方法都需要大约相同的时间,就好像没有并行化一样。为什么会发生这种情况?
【问题讨论】:
-
您是否从方法 2 中获得了正确的输出?变量
y和prob也应该是私有的。 -
对不起,他们在那里是私人的。刚刚编辑过
-
内环和外环的行程次数是多少?
-
如果省略
ordered指令和它所涵盖的代码行,你会得到什么样的时间? -
如果翻转内循环和外循环会怎样?我看到您正在访问
psi[i][j]并迭代j然后i。
标签: c++ for-loop parallel-processing openmp collapse