2017-08-30 30 views
0

GCCでコンパイルされたコードから直接PGI OpenACCランタイムAPIを使用することに興味があります。gccでPGI OpenACCランタイムライブラリを直接リンク

私は、PGI OpenACCのインストールで2つのopenacc.hヘッダーが提供されていることに気付きました。 1つはPGI(include/openacc.hにあります)とGCC(etc/include_acc/openacc.h)と互換性があるように見えるものです。 GCCで2番目のヘッダを使用するのは安全ですか? PGIを使用して

#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; 
} 

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 -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

そして実行します:GCC + GCC OpenACCを歌う

$ ./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(通常は/usr/local/cuda)とPGI(私の場合は/usr/local/pgi/linux86-64/2017/cuda)によって提供されるCUDAランタイムの違いは何ですか? pgccは、それ自身のインストールパスからCUDA 7.5を使用していますが、-ta=cuda8.0が提供されている場合は/usr/local/cudaのものが使用されています。特別な理由はありますか?

答えて

1

PGIコンパイルされたオブジェクトはGNUと相互運用可能で、PGI OpenACCコンパイル済みコードとGNUコンパイル済みオブジェクトを混在させても問題ありません。 OpenACCランタイムライブラリは互換性がないので、OpenACCコードを混ぜないことをお勧めします。 OpenACCのGNUサポートは7.0リリースでかなり改善されているので、私がPGIで働いている間に、両方のコンパイラを試してみることをお勧めします。 1つの注意点は、それら(GNU)が "カーネル"構造をサポートしていないということなので、 "並列"領域の使用に固執したいと思うでしょう。

CUDAライブラリについては、OpenACCコードをコンパイルするために必要なすべてのライブラリがPGIに付属しています。 CUDAライブラリ自体には違いはありませんが、ユーザーがCUDA SDKを一緒にインストールする必要はなく、 "-Mcudalib [= cublas | cufft | curand | cusolver | cusparse]"などの便利なフラグを追加することができます。これらのライブラリへの独自のFortranインタフェースモジュールも含まれています。

あなたはフラグ "CUDAROOT =" あなたのコンパイル行に設定している場合を除き "-ta =テスラ:cuda8.0は" PGIを使用する必要がありますが、「$ PGI/linux86-64/2017 /にありCUDA 8.0ディレクトリを供給cuda/8.0 "となります。あなたは/ usr/local/cudaインストールを使用していると確信していますか?冗長フラグ(-v)を追加すると、コンパイラドライバの実行内容を確認できます。また、 "-dryrun"を指定すると、ドライバでコマンドを実行することなくコマンドを確認できます。

もう1つの可能性は、CUDAインストール(GNUと同様)を指すために "-L"または "-Wl"フラグを使用していることです。この場合、リンカはこれらのディレクトリからCUDAライブラリを取得します。彼らは私たちが出荷しているのと同じライブラリなので、問題ではありません。

+0

ありがとうございます!gcc 7.0をチェックします。 CUDA 8.0ディレクトリに関すること... 'LD_LIBRARY_PATH'が':/ usr/local/cuda/lib64'に設定されていたため、私のせいでした。 – Hopobcn

関連する問題