使用指向方法的指针调用时使用OpenMP

时间:2016-04-30 22:16:26

标签: c++ thread-safety openmp

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的评估是线程安全的?

1 个答案:

答案 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版本,默认情况下,循环变量可能是私有的。