代码之家  ›  专栏  ›  技术社区  ›  Hopobcn

直接将PGI OpenACC运行库与gcc链接

  •  0
  • Hopobcn  · 技术社区  · 7 年前

    我习惯于直接从GCC编译的代码中使用PGI OpenACC运行时API。

    openacc.h include/openacc.h )另一个似乎与GCC兼容( etc/include_acc/openacc.h ). 将第二个标头与GCC一起使用是安全的吗?

    #include <openacc.h>
    #include <cuda_runtime_api.h>
    #include <stdio.h>
    
    int main()
    {
       acc_init( acc_device_nvidia );
    
       int ndev = acc_get_num_devices( acc_device_nvidia );
    
       printf("Num OpenACC devices: %d\n", ndev);
    
       cudaGetDeviceCount(&ndev);
    
       printf("Num CUDA devices: %d\n", ndev);
    
       return 0;
    }
    

    使用PGI:

    pgcc -acc -ta=tesla,cuda8.0 -Mcuda ./test.c -o oacc_test.pgi

    使用GCC+PGI OpenACC:

    gcc -isystem /usr/local/cuda-8.0/include -isystem /usr/local/pgi/linux86-64/17.4/etc/include_acc -o oacc_test.both test.c -L/usr/local/cuda-8.0/lib64 -Wl,-rpath,/usr/local/cuda-8.0/lib64 -lcudart -lcuda -L/usr/local/pgi/linux86-64/17.4/lib -Wl,-rpath,/usr/local/pgi/linux86-64/17.4/lib -laccapi -laccg -laccnc -laccn -laccg2 -ldl -lpgc -lm

    gcc -fopenacc -isystem /usr/local/cuda-8.0/include -o oacc_test.gnu test.c -L/usr/local/cuda-8.0/lib64 -Wl,-rpath,/usr/local/cuda-8.0/lib64 -lcudart -lcuda

    并执行:

    $ ./oacc_test.pgi 
    Num OpenACC devices: 4
    Num CUDA devices: 4
    $ ./oacc_test.both 
    Num OpenACC devices: 4
    Num CUDA devices: 4
    $ ./oacc_test.gnu 
    
    libgomp: device type nvidia not supported
    

    更多信息:

    $ ldd oacc_test.pgi 
        linux-vdso.so.1 (0x00007ffd843f8000)
        libaccapi.so => /usr/local/pgi/linux86-64/17.4/lib/libaccapi.so (0x00007fa5a2b9f000)
        libaccg.so => /usr/local/pgi/linux86-64/17.4/lib/libaccg.so (0x00007fa5a2981000)
        libaccnc.so => /usr/local/pgi/linux86-64/17.4/lib/libaccnc.so (0x00007fa5a2777000)
        libaccn.so => /usr/local/pgi/linux86-64/17.4/lib/libaccn.so (0x00007fa5a2552000)
        libaccg2.so => /usr/local/pgi/linux86-64/17.4/lib/libaccg2.so (0x00007fa5a233c000)
        libcudapgi.so => /usr/local/pgi/linux86-64/17.4/lib/libcudapgi.so (0x00007fa5a213b000)
        libcudart.so.8.0 => /usr/local/cuda/lib64/libcudart.so.8.0 (0x00007fa5a1ed5000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa5a1b49000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa5a1945000)
        libcudadevice.so => /usr/local/pgi/linux86-64/17.4/lib/libcudadevice.so (0x00007fa5a1731000)
        libpgmp.so => /usr/local/pgi/linux86-64/17.4/lib/libpgmp.so (0x00007fa5a14af000)
        libnuma.so => /usr/local/pgi/linux86-64/17.4/lib/libnuma.so (0x00007fa5a12ae000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa5a1091000)
        libpgc.so => /usr/local/pgi/linux86-64/17.4/lib/libpgc.so (0x00007fa5a0dae000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa5a0aaa000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa5a070b000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa5a04f2000)
        /lib64/ld-linux-x86-64.so.2 (0x000055767be3b000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa5a02ea000)
    
    $ ldd oacc_test.both 
        linux-vdso.so.1 (0x00007ffe55753000)
        libcudart.so.8.0 => /usr/local/cuda/lib64/libcudart.so.8.0 (0x00007f7ddfe3c000)
        libcuda.so.1 => /usr/lib/x86_64-linux-gnu/libcuda.so.1 (0x00007f7ddf3d8000)
        libaccapi.so => /usr/local/pgi/linux86-64/17.4/lib/libaccapi.so (0x00007f7ddf1b8000)
        libaccg.so => /usr/local/pgi/linux86-64/17.4/lib/libaccg.so (0x00007f7ddef9a000)
        libaccnc.so => /usr/local/pgi/linux86-64/17.4/lib/libaccnc.so (0x00007f7dded90000)
        libaccn.so => /usr/local/pgi/linux86-64/17.4/lib/libaccn.so (0x00007f7ddeb69000)
        libaccg2.so => /usr/local/pgi/linux86-64/17.4/lib/libaccg2.so (0x00007f7dde955000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7dde751000)
        libpgc.so => /usr/local/pgi/linux86-64/17.4/lib/libpgc.so (0x00007f7dde46e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7dde16a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ddddcb000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7dddbac000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7ddd9a4000)
        libnvidia-fatbinaryloader.so.378.13 => /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.378.13 (0x00007f7ddd753000)
        /lib64/ld-linux-x86-64.so.2 (0x00005593f06f5000)
    
    $ ldd oacc_test.gnu 
        linux-vdso.so.1 (0x00007ffd967d7000)
        libcudart.so.8.0 => /usr/local/cuda/lib64/libcudart.so.8.0 (0x00007f9002679000)
        libcuda.so.1 => /usr/lib/x86_64-linux-gnu/libcuda.so.1 (0x00007f9001c15000)
        libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f90019e8000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f90017cb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f900142c000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9001226000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f900101e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9000d1a000)
        libnvidia-fatbinaryloader.so.378.13 => /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.378.13 (0x00007f9000ac9000)
        /lib64/ld-linux-x86-64.so.2 (0x0000563eee684000)
    

    这样使用PGI OpenACC运行时API安全吗?

    此外,Nvidia提供的CUDA运行时(通常在 /usr/local/cuda )和由PGI提供的(在我的案例中 /usr/local/pgi/linux86-64/2017/cuda )? pgcc -ta=cuda8.0 如果它使用 . 有什么特殊原因吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mat Colgrove    7 年前

    至于CUDA库,PGI提供了编译OpenACC代码所需的所有库。不过,CUDA库本身没有什么不同。我们不希望用户必须共同安装CUDA SDK,它允许我们添加方便标志,例如“-Mcudalib[=cublas | cufft | curand | cusolver | cusparse]”,因为我们知道这些库的位置,并且将我们自己的Fortran接口模块包含到这些库中。

    除非您在编译行上设置了标志“CUDAROOT=”,否则“-ta=tesla:cuda8.0”应该使用位于“$PGI/linux86-64/2017/CUDA/8.0”中的PGI提供的CUDA 8.0目录。你确定它正在使用/usr/local/cuda安装吗?您可以通过添加详细标志(-v)来查看编译器驱动程序正在执行什么,或者通过添加“-dryrun”来查看命令,而无需驱动程序执行它们。