将 pow 用于 GPU 的 openMP

Using pow for openMP for GPU

提问人:Andrew Chedid 提问时间:11/12/2023 更新时间:11/12/2023 访问量:55

问:

我正在尝试在 GPU 上运行 OMP for 循环,该循环使用 pow 来计算值的幂,并且在为 GPU 运行 openMP 时,它无法识别 pow 函数

#pragma omp target teams distribute parallel for private(rsq) enter data map(to:position[0:3*numparticles]) map(tofrom:force[0:3*numparticles]) if(i>THRESHOLD)
    for(int j=0;j<i;j++)
    {
      int j3 = j*3;
      rsq = (position[i3  ]-position[j3  ])*(position[i3  ]-position[j3  ])
                + (position[i3+1]-position[j3+1])*(position[i3+1]-position[j3+1])
                + (position[i3+2]-position[j3+2])*(position[i3+2]-position[j3+2]); 
        
      float sig7= pow(( sigma*sigma / rsq ),7);
      float sig4= pow(( sigma*sigma / rsq ),4);

      // loop over x,y and z components
      for(int k = 0; k < 3; k++)
      {
        
        force[i3+k] +=
             24 * epsilon * ( (position[i3+k]-position[j3+k]) / (sigma*sigma) )  *
            ( 2 * sig7 -  sig4 );
      }
    }

使用命令行

g++ -o md.o -c md.cpp -O3 -g -I.. -fPIC -lm -fopenmp -foffload=nvptx-none -foffload="-O3 -fcf-protection=none"
g++ -shared -o libtp2.so md.o -ldl -lm -lgomp -fopenmp -foffload=nvptx-none -foffload="-O3 -fcf-protection=none"

在编译时,它给了我unresolved symbol pow

C++ GPU OpenMP 功率

评论

0赞 Andrew Chedid 11/12/2023
我做了一个便宜的解决方案float sigma_sq_over_rsq = sigma*sigma / rsq ; float sig4= sigma_sq_over_rsq*sigma_sq_over_rsq*sigma_sq_over_rsq*sigma_sq_over_rsq; float sig7= sig4*sigma_sq_over_rsq*sigma_sq_over_rsq*sigma_sq_over_rsq;
2赞 PierU 11/12/2023
为什么你认为这个问题与OpenMP有关?你包括标题了吗?cmath
0赞 Andrew Chedid 11/12/2023
我放了 -lm 命令行。此外,当我删除子句以将其带到 GPU pow 时,效果很好target teams distribute
0赞 Jérôme Richard 11/12/2023
如果“删除目标团队分配子句”,则不应再使用 GPU,而应使用 CPU。在这种情况下,我不认为 GPU 实际上可以比具有优化代码的 CPU 更快。将数据传输到 GPU 的时间应该高于计算时间(或者在最好的情况下,离计算不远)......
0赞 Jérôme Richard 11/12/2023
顺便说一句,应该很快,因为指数是一个常数。 可以预先计算,如 .事实上,甚至可以预先计算,但它不会没有(这是不安全的)。也可以计算一次。最后,计算不是很密集,如果优化得当,它应该是内存绑定的。powsigma*sigma24 * epsilon1/(sigma*sigma)-ffast-mathposition[i3+k]-position[j3+k]

答: 暂无答案