提问人:Andrew Chedid 提问时间:11/12/2023 更新时间:11/12/2023 访问量:55
将 pow 用于 GPU 的 openMP
Using pow for openMP for GPU
问:
我正在尝试在 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
答: 暂无答案
评论
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;
cmath
target teams distribute
目标团队分配
子句”,则不应再使用 GPU,而应使用 CPU。在这种情况下,我不认为 GPU 实际上可以比具有优化代码的 CPU 更快。将数据传输到 GPU 的时间应该高于计算时间(或者在最好的情况下,离计算不远)......pow
sigma*sigma
24 * epsilon
1/(sigma*sigma)
-ffast-math
position[i3+k]-position[j3+k]