我recently learned如何将对象的方法传递给函数进行评估,现在我想在调用此方法时在循环上使用OpenMP
。实际代码是:
std::vector< std::vector< double > > grid2D( wfn& W, double (wfn::*p)(double, double, double), std::vector< double > xs, std::vector< double > ys, double z ) {
std::vector< std::vector< double > > fs;
int nx = (int)xs.size();
int ny = (int)ys.size();
fs.resize(nx);
for(int ix = 0; ix < nx; ix++) {
fs[ix].resize(ny);
for(int iy = 0; iy < ny; iy++) {
fs[ix][iy] = (W.*p)( xs[ix], ys[iy], z);
}
}
return fs;
}
其中wfn
表示分子的“波函数”,并且存储了许多私有变量来表示物理。
如果我在#pragma omp parallel for
上方的循环上方插入iy
,则fs[ix][iy]
的网格生成不正确。有没有办法将W.*p
私有传递给此#pragma
,以便p
的评估是线程安全的?
答案 0 :(得分:0)
您没有提供有关在第二个for循环之前插入的确切#pragma omp语句的详细信息。我假设您没有声明任何私有变量,因此假定循环内的所有变量都是共享的。这导致线程以不可预测的方式修改数据。您可以通过将private(list_of_variables)添加到语句来声明变量private。您可能希望首先添加&#34;默认(无)&#34; (不带引号)到#pragma omp语句并将所有变量声明为私有。然后,您可以开始从列表中逐个删除变量并声明它们已共享。当然,每次修改后,您都需要重新编译并再次运行代码。有时这个过程需要一段时间才能正确完成。所以你可以从
开始#pragma omp parallel for default(none)private(W,xs,ys,iy,fs,z)firstprivate(ix)
根据您使用的OMP版本,默认情况下,循环变量可能是私有的。