2017-08-30 101 views
0

我有興趣直接從GCC編譯的代碼使用PGI OpenACC運行時API。將PGI OpenACC運行時庫直接鏈接到gcc

我注意到PGI OpenACC安裝提供了兩個openacc.h頭文件。一個用於PGI(位於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

U唱GCC + GCC OpenACC的:(比較)

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從它自己的安裝路徑使用CUDA 7.5,但是當提供-ta=cuda8.0時,它使用/usr/local/cuda中的那個。有什麼特別的理由

回答

1

PGI編譯對象可以與GNU互操作,並且可以將PGI OpenACC編譯代碼與GNU編譯對象混合使用。雖然,OpenACC運行時庫不兼容,所以我建議不要混合OpenACC代碼。請注意,GNU對OpenACC的支持在7.0版本中已經得到了很大的改善,所以當我爲PGI工作時,我鼓勵你嘗試兩種編譯器。有一點需要注意的是,它們(GNU)不支持「內核」構造,因此您需要堅持使用「並行」區域。

至於CUDA庫,PGI提供了我們編譯OpenACC代碼所需的所有庫。雖然,CUDA庫本身沒有區別。我們不希望用戶必須共同安裝CUDA SDK,並且它允許我們添加便利標誌,例如「-Mcudalib [= cublas | cufft | curand | cusolver | cusparse]」,因爲我們知道這些庫位於哪裏以及將這些庫包含我們自己的Fortran接口模塊。

除非在編輯行中設置了「CUDAROOT =」標誌,否則「-ta = tesla:cuda8.0」應該使用PGI提供的CUDA 8.0目錄,位於「$ PGI/linux86-64/2017/CUDA/8.0" 。你確定它使用/ usr/local/cuda安裝嗎?您可以通過添加詳細標誌(-v)來查看編譯器驅動程序正在執行的內容或「-dryrun」來查看命令,而無需驅動程序執行它們來進行仔細檢查。

另一種可能是您使用「-L」或「-Wl」標誌指向CUDA安裝(就像您使用GNU一樣),在這種情況下,鏈接器將從這些目錄中提取CUDA庫。雖然它們與我們發佈的庫相同,但它不應該是一個問題。

+0

謝謝!我會檢查gcc 7.0。關於CUDA 8.0目錄的事情......這是我的錯,因爲'LD_LIBRARY_PATH'被設置爲':/ usr/local/cuda/lib64' – Hopobcn