Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;密码?_C++_C++11_Openmp - Fatal编程技术网

C++ C++;密码?

C++ C++;密码?,c++,c++11,openmp,C++,C++11,Openmp,如何使用openmp并行化此代码: xp、yp、zp、gpx、gpy和gpz是已知的一维向量 for (ies = 0; ies < 1000000; ies++){ for (jes = ies+1; jes < 1000000; jes++){ double dxp = xp[ies] - xp[jes]; double dyp = yp[ies] - yp[jes]; double dzp = zp[ies] - zp[

如何使用openmp并行化此代码: xp、yp、zp、gpx、gpy和gpz是已知的一维向量

for (ies = 0; ies < 1000000; ies++){
    for (jes = ies+1; jes < 1000000; jes++){

        double dxp = xp[ies] - xp[jes];
        double dyp = yp[ies] - yp[jes];
        double dzp = zp[ies] - zp[jes];
        double distance = sqrt( dxp * dxp + dyp * dyp + dzp * dzp );
        double gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];
        #pragma omp parallel for
        for (kes = 1; kes <= 100; kes++){

            double distan = kes * distance;
            E1[kes] = E1[kes] + gpspec * sin(distan) / distan;
        }
    }
}
for(ies=0;ies<1000000;ies++){
对于(jes=ies+1;jes<1000000;jes++){
双dxp=xp[ies]-xp[jes];
双dyp=yp[ies]-yp[jes];
双dzp=zp[ies]-zp[jes];
双倍距离=sqrt(dxp*dxp+dyp*dyp+dzp*dzp);
双gpspec=gpx[ies]*gpx[jes]+gpy[ies]*gpy[jes]+gpz[ies]*gpz[jes];
#pragma-omp并行

对于(kes=1;kes您已经在最里面的循环上有了一个
omp parallel for
pragma。要实现这一效果,您可能需要通过设置编译器标志(例如,对于GCC编译器套件,这将是
-fopenmp
标志)在编译器中启用OpenMP支持。您可能还需要
#包括
omp.h
标题

但是说到这里,我怀疑你是否会从并行化中获得很多好处,因为你正在并行化的一次循环运行并没有做多少工作。并行化带来的运行时开销抵消了同时运行多个循环迭代的好处,所以我认为你不会得到太多好处

这是一种可能性(未经测试)

#pragma omp并行简化(+:E1)私有(jes,kes)调度(动态)
对于(ies=0;ies<1000000;ies++){
对于(jes=ies+1;jes<1000000;jes++){
双dxp=xp[ies]-xp[jes];
双dyp=yp[ies]-yp[jes];
双dzp=zp[ies]-zp[jes];
双倍距离=sqrt(dxp*dxp+dyp*dyp+dzp*dzp);
双gpspec=gpx[ies]*gpx[jes]+gpy[ies]*gpy[jes]+gpz[ies]*gpz[jes];

对于(KES=1;KES标题)表示C++,但是TAG表示C.是正确的,我很抱歉这个错误。它是C++。我知道如何编译代码并使用-fOpenMP、γ包含。我只对“KES”循环进行并行化。但是,我认为它不是有效的。我希望将“IE”循环或“JES”循环与“KES”循环并行。因为“IE”循环的大小=“JES”的大小。loop=1000 000。@LucNguyen,如果这是您想知道的,那么您应该在问题中这样说。在这种情况下,您可能希望通过扩展并行化范围来克服数据竞争。非常感谢您的建议。我使用“#pragma omp parallel For redu”测试了代码Action(+:E1)private(ies,jes,kes)”,计算时间显著减少。但是,使用“#pragma omp parallel for reduce(+:E1[:])private(jes,kes)schedule(dynamic)”,计算速度更快,并且可以加载整个内核。编译器接受“reduce(+:E1[:])。
#pragma omp parallel for reduction(+: E1) private(jes, kes) schedule(dynamic)
for (ies = 0; ies < 1000000; ies++){
    for (jes = ies+1; jes < 1000000; jes++){

        double dxp = xp[ies] - xp[jes];
        double dyp = yp[ies] - yp[jes];
        double dzp = zp[ies] - zp[jes];
        double distance = sqrt( dxp * dxp + dyp * dyp + dzp * dzp );
        double gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];
        for (kes = 1; kes <= 100; kes++){

            double distan = kes * distance;
            E1[kes] = E1[kes] + gpspec * sin(distan) / distan;
        }
    }
}