PGIトップ PGIアクセラレータ コンパイラ 使用における FAQ
ソフテックは、PGI 製品の公認正規代理店です
本ページは、NVIDIA社の CUDA™ 環境を備えた GPU 対応のコンパイラ機能を有する PGIアクセラレータ™ コンパイラの使用時における問題に関する FAQ のページです。PGIアクセラレータ™ コンパイラ製品の一般的な事項に関する FAQ は、別のページにてご案内しております。
© 株式会社ソフテック
PGIアクセラレータに関しての回答
1. CUDAソフトウェアをインストールしておく必要がありますか?
CUDAのソフトウェア環境は、予めシステムに導入して頂いておく必要があります。現在、CUDAソフトウェアは、NVIDIA社のサイトからダウンロードできます。CUDAドライバと SDK の環境を構築後、PGIコンパイラをインストールします。インストール後、PGIコンパイラの CUDA 用の初期設定ファイル 'sitenvrc' (以下、参照)を $PGI/linux86-64/9.0/bin (Linux64ビットの場合)配下に作成します。以下の例は、CUDAソフトウェアの実装場所が /usr/local/cuda の場合の例です。
set NVOPEN64DIR=/usr/local/cuda/open64/lib;
set CUDADIR=/ousr/local/cuda/bin;
set CUDALIB=/usr/local/cuda/lib;
現在、CUDAソフトウェアの compute capability は 1.3 をデフォルトとしてコンパイルしますが、もし、これ以前の 1.0や 1.1 の GPU/CUDA を使用している場合は、コンパイルオプションで、"-ta=nvidia,cc10" あるいは、 "-ta=nvidia,cc11" を明示的に使用するか、あるいは、'sitenvrc' ファイルにset COMPUTECAP=10;" あるいは "set COMPUTECAP=11;"を記述します。
(2009/9/30追記)
CUDA 2.3 以降では、CUDAの実装ライブラリ・パス名が、32bit用と64bit用に分けられましたので、Linux 64ビットOS の場合は、CUDALIB を以下のように設定する必要があります。
set CUDALIB=/usr/local/cuda/lib64;
(2009/12/10追記)
PGI 2010 (PGI 10.0) の正式リリース後は、上記の'sitenvrc'ファイルを設定する必要がなくなりました。NIVIDIA社の許可により、必要となるCUDAのライブラリは、PGIのインストール時に実装されます。なお、上記の中のset COMPUTECAP=10;と言ったサイト特有の設定が必要な場合は、'sitenvrc'ファイルを明示的に作成して、その中にセットして下さい。
(ご参考)
2. コンパイル時に、/usr/include/c++/4.3/x86_64-suse-linux/bits/c++config.h(1642): error:と言ったエラーが出ます。(Linux 64bit) エラーの一例は以下のようなものです。
kato@photon28:~/GPGPU/PGItest> pgf90 -Minfo -ta=nvidia f3.f90
/usr/include/c++/4.3/x86_64-suse-linux/bits/c++config.h(1642): error: expected a "{"
/usr/include/c++/4.3/bits/cpp_type_traits.h(74): error: expected a "{"
/usr/include/c++/4.3/bits/cpp_type_traits.h(81): error: expected a "{"
/usr/include/c++/4.3/bits/cpp_type_traits.h(299): error: name followed by "::"
must be a class or namespace name
/usr/include/c++/4.3/bits/cpp_type_traits.h(299): error: too many arguments for
class template "<error>::__is_normal_iterator"
/usr/include/c++/4.3/bits/cpp_type_traits.h(299): error: name followed by "::"
must be a class or namespace name
/usr/include/c++/4.3/bits/cpp_type_traits.h(299): error: too many arguments for
class template "<error>::__is_normal_iterator"
(以下、略)
この問題は、GNU g++ 4.3 ヘッダーファイルと NVIDIA CUDAソフトウェア間の非互換性によることで生じます。これを改修するには、PGIコンパイラの設定ファイル $PGI/linux86-64/{release}/bin/sitenvrc ファイルに、"set GCCVERSION=40301;" (一例)を追加することで回避できます。もし、sitenvrc ファイルが存在しない場合は、このファイル名で作成して、以下の記述を行って下さい。
まず、GNU g++のバージョンを確かめます。
kato@photon28:~/GPGPU/PGItest> g++ -v
(略)
gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux)
GCCVERSION が 4.3.2 であることが分かります。これを GCCVERSION=40302; と表記します。
PGI のインストールバージョンが PGI 9.0-4 とした場合、$PGI/linux86-64/9.0-4/bin/sitenvrc ファイルの中に以下の記述を追加記述します。
set GCCVERSION=40302;
3. CUDA Fortranのコンパイル・リンク時に、cannot find -lcudartと言ったエラーが出ます。(Linux 64bit) エラーの一例は以下のようなものです。
kato@photon28:~/GPGPU/PGItest> pgf90 -O2 sgemm.cuf /usr/bin/ld: skipping incompatible /usr/local/cuda/lib/libcudart.so when searching for -lcudart /usr/bin/ld: cannot find -lcudart
この問題は、CUDAソフトウェアの libcudart.so ライブラリの互換性がないために生じる問題です。上記の FAQ #001 を参考に、PGIコンパイラの初期設定ファイル siteenvrc の CUDALIBの設定に誤りがないか確認して下さい。64bit Linux の場合、よくある間違いは、set CUDALIB=/usr/local/cuda/lib64;とすべきところを set CUDALIB=/usr/local/cuda/lib; としている場合があります。但し、CUDA 2.2 以前は、CUDAのソフトウェア実装が異なっていたため、64bit Linux の場合でも set CUDALIB=/usr/local/cuda/lib; でした。実際に実装されている CUDA のバージョンをお確かめの上、適切な設定を行って下さい。
PGI 2010 リリース以降では、cuda ライブラリは、PGIに同梱され、インストール時に実装しますので、こうした問題はないはずです。
4. Linux上で、ユーザアカウント環境でGPUが認識されません。pgaccelinfoコマンドで見ても、No accelerators foundと表示されます。
この問題は、NVIDIA CUDAの既知のものであり、CUDAアプリケーションを実行する際に、Linuxカーネル上の CUDA module のロードが行われておらず、そして /dev 上の nvidia エントリが作成されていないために生じます。システムのブート時に明示的に、以下のスクリプトを実行するようにしてください。もし、これにても改善されない場合は NVIDIA CUDA Zone 等に問い合わせて下さい。
#!/bin/bash # chkconfig: 2345 90 10 ### BEGIN INIT INFO # Provides: NVIDIA # Required-Start: # Required-Stop: # Default-Start: 3 5 # Default-Stop: # Description: CUDA module must be loaded and the entries in /dev created. ### END INIT INFO modprobe nvidia if [ "$?" -eq 0 ]; then # Count the number of NVIDIA controllers found. N3D=`/sbin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l` NVGA=`/sbin/lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l` N=`expr $N3D + $NVGA - 1` for i in `seq 0 $N`; do mknod -m 666 /dev/nvidia$i c 195 $i; done mknod -m 666 /dev/nvidiactl c 195 255 else exit 1 fi
ルート権限で、上記の内容を CUDA(一例)と言うファイルに記述します。このファイルを /etc/init.d 配下に置きます。そして、以下の chkconfig コマンドで、Linux ブート時に常に CUDA moduleのロードと /dev/nvidia** の作成を行うように設定します。
[root@photon29 init.d]# pwd /etc/init.d [root@photon29 init.d]# ls -l CUDA -rwxr-xr-x 1 root root 640 12月 22 21:55 CUDA [root@photon29 init.d]# chkconfig --add CUDA (boot時にCUDAスクリプトを実行するための設定) [root@photon29 init.d]# chkconfig --list CUDA CUDA 0:off 1:off 2:off 3:on 4:off 5:on 6:off
5. Linux版 PGI 10.3リビジョン(2010年3月リリース)で、PGIアクセラレータ用のコンパイル(-ta=nvidiaオプション)時、並びに CUDA Fortran 用のコンパイル(-Mcudaオプション)時に、以下のようなアセンブラのエラーで実行モジュールが生成出来ません。
「日本語」ロケールの場合(export LANG="ja_JP.UTF-8"等で初期設定されている場合) $ pgcc -ta=nvidia t.c -V10.3 t.s: Assembler messages: t.s:536: Error: junk at end of line, first unrecognized character is `.'
この問題は、PGI 10.3 Linux版を使用する際、shellのセッションを「日本語のロケール」で環境をセットしている場合に生じます。「日本語のロケール」とは、具体的に言えば、コマンドのメッセージ等で日本語の表示が出るような環境を言います。現在、この問題は弊社から米国 PGI 社に Technical Problem Report として報告していますが、暫定的に以下の方法で、この問題を回避でしてください。
各自のユーザ shell のセッショにおいて、「日本語」ロケールの使用を止め、「英語」ロケールを設定することでこの問題を解決できます。なお、本問題は、PGI 10.4 にて修正されました。
具体的には、$HOME/.bashrc (bash の場合)内に以下を加えて、セッション開始時に環境変数 LANG を
設定する。
export LANG=C
あるいは、コンパイラを使用する時の shell のセッションの開始時に明示的に以下のコマンドを実行する。
export LANG=C