PGIトップ › PGIアクセラレータ コンパイラ › 使用における FAQ

ソフテックは、PGI 製品の公認正規代理店です

PGIアクセラレータ™ コンパイラの使用における FAQ

 本ページは、NVIDIA社の CUDA™ 環境を備えた GPU 対応のコンパイラ機能を有する PGIアクセラレータ™ コンパイラの使用時における問題に関する FAQ のページです。PGIアクセラレータ™ コンパイラ製品の一般的な事項に関する FAQ は、別のページにてご案内しております。
© 株式会社ソフテック

PGI アクセラレータ™コンパイラの使用時、技術的な問題等の FAQ

▶ 一般的な事項の FAQ は、こちらのページへ

 

PGIアクセラレータに関しての回答

Question  1. CUDAソフトウェアをインストールしておく必要がありますか?

Answer

 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'ファイルを明示的に作成して、その中にセットして下さい。
(ご参考)

Question  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"
(以下、略)

Answer  この問題は、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;

Question  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

Answer  この問題は、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に同梱され、インストール時に実装しますので、こうした問題はないはずです。

Question  4. Linux上で、ユーザアカウント環境でGPUが認識されません。pgaccelinfoコマンドで見ても、No accelerators foundと表示されます。

Answer  この問題は、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

Question  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 `.'

Answer  この問題は、PGI 10.3 Linux版を使用する際、shellのセッションを「日本語のロケール」で環境をセットしている場合に生じます。「日本語のロケール」とは、具体的に言えば、コマンドのメッセージ等で日本語の表示が出るような環境を言います。現在、この問題は弊社から米国 PGI 社に Technical Problem Report として報告していますが、暫定的に以下の方法で、この問題を回避でしてください。

各自のユーザ shell のセッショにおいて、「日本語」ロケールの使用を止め、「英語」ロケールを設定することでこの問題を解決できます。なお、本問題は、PGI 10.4 にて修正されました。

具体的には、$HOME/.bashrc (bash の場合)内に以下を加えて、セッション開始時に環境変数 LANG を
設定する。
    export LANG=C
    

あるいは、コンパイラを使用する時の shell のセッションの開始時に明示的に以下のコマンドを実行する。
    export LANG=C
PGI製品問合せはソフテックへ
PGI製品問合せはソフテックへ