调试OpenMP Python C扩展卸载

时间:2019-09-24 15:51:17

标签: python openmp offloading

我正在使用建模工具箱Anuga,并将其设置为在parallel支持下运行。据我目前的了解,其背后的机制是Numpy被extended所包含的C模块通过OpenMP暴露给了

extra_args = ['-fopenmp']

我已经开发并测试了可以通过mpirun -np 4 python <myscript.py>运行的脚本,并且可以正常工作。由于模型越来越大,我的兴趣是通过OpenMP将某些处理以NVIDIA GPU的物理形式转移到GPU。我读到有关这称为卸载的信息。我已经使用

安装了Quadro K2000
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 418.56       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K2000        Off  | 00000000:01:00.0  On |                  N/A |
| 32%   48C    P8    N/A /  N/A |    403MiB /  1999MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+

所以我

  1. 在我的Ubuntu 19.04上安装了gcc-offload-nvptx,该版本读取gcc的版本8。然后,我

  2. 将编译器标志更改为

extra_args = ['-fopenmp', '-fstack-protector']

  1. 通过python setup.py build编译了安装。这将为目标模块cg_ext.c返回以下消息,而没有其他错误:
  

x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions-Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2-墙壁-Wstrict原型-Wdate-time -D_FORTIFY_SOURCE = 2 -g -fdebug-prefix-map = / build / python2.7-rzpqx3 / python2.7-2.7.16 =。 -fstack-protector-strong -Wformat -Werror =格式安全性-Wl,-符号功能-Wl,-z,相关-Wdate-time -D_FORTIFY_SOURCE = 2 -g -fdebug-prefix-map = / build / python2。 7-rzpqx3 / python2.7-2.7.16 =。 -fstack-protector-strong -Wformat -Werror = format-security build / temp.linux-x86_64-2.7 / anuga / utilities / cg_ext.o -Lbuild / temp.linux-x86_64-2.7 -o build / lib.linux-x86_64 -2.7 / anuga / utilities / cg_ext.so -fopenmp -fstack-protector

何时

  1. 我用得到的ldd检查编译的库
  

build / lib.linux-x86_64-2.7 / anuga / utilities / cg_ext.so       linux-vdso.so.1(0x00007fff7a9fa000)       libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1(0x00007f0650502000)
      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6(0x00007f0650317000)
      libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2(0x00007f0650311000)
      libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0(0x00007f06502f0000)
      /lib64/ld-linux-x86-64.so.2(0x00007f0650606000)

所以我认为一切都已正确设置。我现在转到

  1. 按如下方式更改对一个例程的实用注释:

之前:

void cg_daxpy(int N, double a, double *x, double *y)
{
  int i;
  #pragma omp parallel for private(i)
  for(i=0;i<N;i++)
  {
    y[i]=y[i]+a*x[i];
  }
}

之后:

void cg_daxpy(int N, double a, double *x, double *y)
{
  int i;
  #pragma omp target device(0)
  {
  #pragma omp parallel for
  for(i=0;i<N;i++)
  {
    y[i]=y[i]+a*x[i];
  }
  }
}

然后我重新编译安装并按如下所示运行脚本,以期获取性能分析信息:

nvprof --print-gpu-trace --profile-child-processes --profile-from-start off -fo %p.nvprof python -m cProfile runDamBreak.py

这将返回消息

==19444== Profiling application: orted --hnp --set-sid --report-uri 14 --singleton-died-pipe 15 -mca state_novm_select 1 -mca ess hnp -mca pmix ^s1,s2,cray,isolated
==19444== Profiling result:
No kernels were profiled.

因此,总而言之,我了解编译器可以理解编译指示,但不会将任何段发送到GPU。非常感谢有关进一步调试的任何提示。

最诚挚的问候

塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

大多数gcc / llvm / clang二进制软件包都支持禁用GPU,您需要编译自己的编译器才能启用它。

据我所知,gcc无法通过卸载来生成共享库,因此如果您想为Python创建C扩展,则可能会陷入llvm。

但是,我面临一个类似的问题:我使用llvm并明确启用了卸载。每当我尝试在Cython生成的代码中使用OpenMP目标时,它根本找不到任何设备(omp_get_num_devices()返回0)。即使在使用调用omp_get_num_devices()的函数显式dlopen'.so的情况下,在普通C程序中运行完全相同的代码也可以正常工作。这真的很奇怪。