简体   繁体   English

OpenMP GPU 卸载数学库?

[英]OpenMP GPU offloading math library?

I am trying to offload code the GPU using OpenMP 4+ directives.我正在尝试使用 OpenMP 4+ 指令卸载 GPU 的代码。 I am using ubuntu 16.04 with GCC 7.2 and for general cases it is working fine.我将 ubuntu 16.04 与 GCC 7.2 一起使用,对于一般情况,它工作正常。 My problem comes when I am trying to offload a code that has a call to the sqrtf function that is defined in "math.h".当我尝试卸载调用“math.h”中定义的sqrtf函数的代码时,我的问题就出现了。 The troubeling code is this:麻烦的代码是这样的:

#pragma omp target teams distribute \
map(to:posx[:n],posy[:n],posz[:n]) \
map(from:frcx[:n],frcy[:n],frcz[:n])
for (int i = 0; i < n; i++) {
  frcx[i] = 0.0f;
  frcy[i] = 0.0f;
  frcz[i] = 0.0f;

  for (int j = 0; j < n; j++) {
    float dx = posx[j] - posx[i];
    float dy = posy[j] - posy[i];
    float dz = posz[j] - posz[i];
    float distSqr = dx*dx + dy*dy + dz*dz + SOFTENING;
    float invDist = 1.0f / sqrtf(distSqr);
    float invDist3 = invDist * invDist * invDist;

    frcx[i] += dx * invDist3;
    frcy[i] += dy * invDist3;
    frcz[i] += dz * invDist3;
  }
}

When I try to compile it with:当我尝试编译它时:

$ gcc -Wall -O2 -march=native -mtune=native -fopenmp -o nbody_cpu_arrays_parallel_gpu common_funcs.c nbody_cpu_arrays_parallel_gpu.c -lm
unresolved symbol sqrtf
collect2: error: ld returned 1 exit status
mkoffload: fatal error: x86_64-linux-gnu-accel-nvptx-none-gcc-7 returned 1 exit status
compilation terminated.
lto-wrapper: fatal error: /usr/lib/gcc/x86_64-linux-gnu/7//accel/nvptx-none/mkoffload returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status

How can I make use of square root operations (or other mathematical functions) when offloading OMP code to GPUs?将 OMP 代码卸载到 GPU 时,如何使用平方根运算(或其他数学函数)?

I encountered a similar issue.我遇到了类似的问题。 https://github.com/bisqwit/cpp_parallelization_examples/blob/master/README.md very helpfully describes the solution: https://github.com/bisqwit/cpp_parallelization_examples/blob/master/README.md非常有帮助地描述了解决方案:

When offloading, you may get linker problems from math functions if you do an optimized build.卸载时,如果您进行优化构建,您可能会从数学函数中遇到链接器问题。 To resolve, add -foffload=-lm -fno-fast-math -fno-associative-math要解决,请添加 -foffload=-lm -fno-fast-math -fno-associative-math

For reference, the errors I got with sqrt:作为参考,我使用 sqrt 遇到的错误:

libgomp: Link error log ptxas application ptx input, line 138; error   : Label expected for argument 0 of instruction 'call'
ptxas application ptx input, line 138; fatal   : Call target not recognized
ptxas <macro util>, line 9; error   : Illegal modifier '.div' for instruction 'mov'
ptxas fatal   : Ptx assembly aborted due to errors


libgomp: cuLinkAddData (ptx_code) error: a PTX JIT compilation failed

libgomp: Cannot map target functions or variables (expected 2, have 4294967295)

And with sqrtf:并使用 sqrtf:

unresolved symbol sqrtf
collect2: error: ld returned 1 exit status
mkoffload: fatal error: x86_64-pc-linux-gnu-accel-nvptx-none-gcc returned 1 exit status
compilation terminated.
lto-wrapper: fatal error: gcc/x86_64-pc-linux-gnu/7.3.0//accel/nvptx-none/mkoffload returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed

clang 9.0 now has the feature that replace the standard math library function with equivelant version of ptx code (nvidia gpu ), which is not yet supported by gcc 9.0. clang 9.0 现在具有用等效版本的 ptx 代码(nvidia gpu)替换标准数学库函数的功能,gcc 9.0 尚不支持该功能。

Compile and run: https://www.hahnjo.de/blog/2018/10/08/clang-7.0-openmp-offloading-nvidia.html编译运行: https : //www.hahnjo.de/blog/2018/10/08/clang-7.0-openmp-offloading-nvidia.html

commit of clang : https://reviews.llvm.org/D61399叮当的提交: https : //reviews.llvm.org/D61399

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM