DALAB情報発信用ブログ:OpenCAE+GPGPU+Peridynamics編

DALABで行っている研究活動の中で、OpenCAEやGPGPUや破壊解析の取り組みについてまとめてゆきます。

DEXCS2012-Salomeの有効活用:CUDA5によるGPGPU環境構築(1)

2013年06月05日 11時38分11秒 | OpenCAE活用
ここではアプリケーションとしてのCAEから発展して、CUDA5.0を用いたGPGPUプログラミング環境を構築して、超並列数値解析によるCAEの可能性を検証したいと思います。

ベースとなるシステムは、DEXCS2012-Salome-D1-B1-64を利用します。平成25年5月末に公式サイトから公開しています。これはベースとしてはUbuntu12.04-LTS-64になるので、DEXCSでなくても同様な構築は可能だと思うので、パッケージの追加などはそれぞれの環境で確認してください。

まずはDEXCS2012-Salome-D1-B1-64.isoを用いてベースの環境を構築します。目的はGPGPUによるCUDAプログラミングなのでGPUの活用が前提です。しかし現時点では仮想マシンからはGPUが利用できないと思うので、CUDA5.0に対応したGPUが搭載されたPCに直接にDEXCSをインストールすることになります。

ISOファイルからDEXCSインストール用DVDを作成したら、このDVDから起動して以下の手順に従ってベースの環境の構築を進めてください。なおネットワークからソフトウエアをダウンロードする方法で進めるので、ネットワークは必須になります。またGPUも利用可能な状態であることが前提です。
(インストール手順は作成中:基本的にはインストーラ「Custom12.04のインストール」の指示どおり)

なおベースのUbuntu12.04では、アップデートマネージャーでシステムを最新の状態にしておきます。

■ CUDAドライバのインストール

NVIDIAのGPUデバイスを利用するためには、ドライバをインストールする必要があります。この方法には色々ありますが、4つほど紹介します。簡単に実行するお勧めは2の方法です。

1:CUDAのインストールパッケージを用いて、ToolkitとSamplesと同時にドライバを導入することもできますが、GUIの停止や再開などの手間が必要になる場合があります。また設定ツールのインストールなども面倒になります。

2:Ubuntuの場合にはシステムの標準的な方法が、メニューのアプリケーション→システムツール→システム設定→追加のドライバーにあります。デスクトップPCでシステムがGPUを認識すれば、この方法が最も確実な方法になります。

3:上記のNVIDIAのダウンロードページから、利用するGPUを選択してLinux64bit-Japaneseの条件で検索し、NVIDIA-Linux-x86_64-319.23.runをダウンロード出来ました。これを用いてGPUドライバを導入する方法です。

実は検証用のノートPCでは、GeForce GT555Mが搭載されているのですが、Ubuntuの追加のドライバーでは認識できず、確実な2の方法が実行できません。そこで、NVIDIAのサイトからダウンロードする3の方法がありますが、これも1と同じような難しい手順が必要です。
http://www.nvidia.co.jp/Download/index.aspx?lang=jp

最後に、UbuntuのSynapticパッケージマネージャを利用する4の方法があります。これはノートPCなどで、CPUとGPUのグラフィック機能が両方あって、目的に応じて使い分ける「NVIDIA OPTIMUS」により制御する場合に対応する方法です。Linux上でnvidia optimus機能に対応するために、bumblebeeを用います。
http://bumblebee-project.org/

4:DEXCS2012-SalomeにはSynapticが既に導入してあるので、アプリケーション→システムツール→システム管理→Synapticパッケージマネージャを起動します。

(0) bumblebeeを導入する準備として、端末より以下のコマンドを入力しておきます。続いてSynapticの再読み込みで最新のパッケージ情報にしておきます。
$ sudo add-apt-repository ppa:bumblebee/stable

(1) Synapticの検索よりbumblebeeを探します。以下の3つが見つかるので、インストール指定して関連ツールも導入します。
bumblebee, bumblebee-dbg, bumblebee-nvidia

(2) 適用を実行して、インストールを進めます。これによってnvidia-currentのドライバもインストールされます。Synapticの検索でnvidiaより探して確認しておきます。

(3) これまで使われていたnvidia-gpu用の汎用ドライバNouveau display driverを削除するため、Synapticでnouveauを検索して、xserver-xorg-video-nouveauを完全削除します。

(4) ここで導入したGPU用のドライバなどを有効にするために、再起動します。

(5) ドライバの導入を確認するために、端末よりCPU動作のglxspheresとGPU動作のoptirun glxsperesで画像の生成の状態や結果出力よりnvidia-gpuの動作を確認できます。

以上の手順で導入されたnvidia-currentのドライバは、Synapticで確認すると304.88です。次に導入するCUDA-5.0では304.54より新しいドライバが必要なので、一応大丈夫です。

■ CUDAシステムの構築環境準備

以下の手順では、全てSynapticを用いて導入して、リンクの調整などを端末でコマンド入力により進めます。

・glutの導入: glutで検索
freeglut3, freeglut3-dbg, freeglut3-dev の3つが導入された状態にする。関連する追加パッケージも導入する。
以下のコマンドでリンクを張る。
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so

・g++の導入: g++で検索
g++, g++-4.6, libstdc++6-4.6-dev の3つが導入された状態にする。

・OpneMPIの導入: openmpiで検索
最新版としてver1.5が必要なので、openmpi1.5-bin, openmpi1.5-checkpoint, openmpi1.5-common, openmpi1.5-doc の4つと、
libopenmpi1.5-2, libopenmpi1.5-dbg, libopenmpi1.5-dev の3つが 導入された状態にする。関連する追加パッケージも導入する。

ただしDEXCS-Salomeとしても利用する場合で、Gmshのメッシュツールを動作させるには、OpenMPI-1.4.3が前提になるので、上記の導入によりGmshは動作しなくなるので、上部パネルからも削除しておく。

・Xiの導入: xiで検索
libxi-dev, libxi6, libxi-dbg の3つが導入された状態にする。

・Xmuの導入: xmuで検索
libxmu6, libxmu-dev, libxmu-headers, libxmu-dbg 4つが 導入された状態にする。

以上で準備は終わりです。

■ CUDAシステムのインストール

ドライバを導入してベースシステムが出来たので、次はCUDAのプログラミング環境を準備します。以下のNVIDIAサイトからUbuntu12.04-64bitに対応したCUDA-5.0システムをダウンロードします。「LINUX: CUDA 5.0 Production Release」のUbuntu11.10-64bitを選択します。
https://developer.nvidia.com/cuda-toolkit-50-archive

最新版CUDA-5.5のダウンロードは、以下より可能ですが、これはDriver-319以上が必要になり、上記の手順では304.88なので、導入には面倒な手順が必要になります。
https://developer.nvidia.com/cuda-downloads

・準備作業
現時点で最新の「cuda_5.0.35_linux_64_ubuntu11.10-1.run」をダウンロードしたら、端末を開いて、CUDA作業用フォルダ~/CUDAworkを作って、そこにファイルを移動して、準備を進めます。
$ cd ~
$ mkdir CUDAwork
$ mv ~/Downloads/cuda_5.0.35_linux_64_ubuntu11.10-1.run ~/CUDAwork/
$ cd CUDAwork
$ chmod a+x cuda_5.0.35_linux_64_ubuntu11.10-1.run

・構築手順
それでは、CUDA-5.0の導入を進めます。このインストールファイルはCUDA-5.0の、Driver, Toolkit, Samples、3つをインストール出来ますが、先にnvidia-currentで304.88のCUDA対応のGPUドライバをインストールしているので、Toolkit,Samplesのみを導入します。
$ sudo ./cuda_5.0.35_linux_64_ubuntu11.10-1.run で実行者のパスワードを入力し、インストールファイルを実行します。

英文でライセンスや利用条件などが出力されますが、確認しながらスペースバーで最後まで進めます。

最後に、Do you accept the previously read EULA? (accept/decline/quit): に対して、acceptで進めます。

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 304.54? ((y)es/(n)o/(q)uit): に対しては先に述べたように不要なので、noで進めます。

Install the CUDA 5.0 Toolkit? ((y)es/(n)o/(q)uit): に対しては必要なので、yesで進めます。

Enter Toolkit Location [ default is /usr/local/cuda-5.0 ]: に対してはデフォルトにするので、Enterで進めます。

Install the CUDA 5.0 Samples? ((y)es/(n)o/(q)uit): に対しては必要なので、yesで進めます。

Enter CUDA Samples Location [ default is /usr/local/cuda-5.0/samples ]: に対してはデフォルトにするので、Enterで進めます。

Installing the CUDA Toolkit in /usr/local/cuda-5.0 ... と表示されてインストールが進みます。しばらくかかります。

インストールの結果が以下の様に示されます。
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-5.0
Samples: Installed in /usr/local/cuda-5.0/samples (pristine) and /home/dexcs/NVIDIA_CUDA-5.0_Samples (writable)

最後に以下の警告が出ますが、取り敢えず動作するので先に進めます。
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 304.54 is required for CUDA 5.0 functionality to work.

・環境変数など

続いて以下の手順に示されたように、プログラミングに関する環境変数などを設定します。
* Please make sure your PATH includes /usr/local/cuda-5.0/bin
* for 64-bit Linux distributions add /usr/local/cuda-5.0/lib64 and /lib to /etc/ld.so.conf and run ldconfig as root

$ vi ~/.bashrc でファイルの最後に以下を追加します。
# cuda
export PATH=/usr/local/cuda-5.0/bin:${PATH}
端末を閉じて新しい端末を開いてから、printenv | grep PATH で設定を確認します。

$ sudo vi /etc/ld.so.conf でファイルの最後に以下を追加します。
/usr/local/cuda-5.0/lib64
/usr/local/cuda-5.0/lib
/usr/lib/nvidia-current
設定したら、sudo ldconfig してから、ldconfig -p | grep cuda で設定を確認します。なお、nvidia-currentの場所は導入したドライバによって異なっています。

・ライブラリの設定

本当ならこれで環境構築は完了なのですが、Samplesをコンパイルするときに、libcuda.soが無いとエラーが出るので、応急的に以下のコマンドでリンクを作っておきます。
$ sudo ln -s /usr/lib/nvidia-current/libcuda.so /usr/local/cuda-5.0/lib64/libcuda.so

■ CUDA Samplesのコンパイル

上記のインストールにより、/home/dexcs/NVIDIA_CUDA-5.0_Samples が作られているので、そこでコンパイルを以下の様に実行します。
$ cd /home/dexcs/NVIDIA_CUDA-5.0_Samples
$ make

相当に時間がかかりますが、終わるまで暫く待ちます。ここでエラーなどで停止した場合には、準備作業が不完全か、バージョンの不一致などですので、メッセージを良く見て対応します。

エラー無く以下のメッセージが出たらコンパイルが全て完了です。
Finished building CUDA samples

■ CUDA Samplesの実行

上記のコンパイルで作られた実行形式は、~/NVIDIA_CUDA-5.0_Samples/bin/linux/release に作られるので、移動します。
$ cd ~/NVIDIA_CUDA-5.0_Samples/bin/linux/release

ここでそのまま ./deviceQuery と実行しても、以下の様に実行できません。NVIDIA Optimusが制御出来ないからです。
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected

そこで、optirun ./deviceQuery と実行すると、以下の様に正しく実行できます。これでCUDA-5.0が動作することが確かめられました。ただしoptirunよる実行では、最初に切り替え時間がかかるようです。
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "GeForce GT 555M"
CUDA Driver Version / Runtime Version 5.0 / 5.0
CUDA Capability Major/Minor version number: 2.1
……
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.0, CUDA Runtime Version = 5.0, NumDevs = 1, Device0 = GeForce GT 555M

それでは、画像生成による例として nbody を試してみます。
$ optirun ./nbody とすると、GPUにより高速に天体の多体問題の計算が進みます。30GFLOPSぐらい出ています。
$ oprirun ./nbody -cpu とすると、 非常に低速な処理になることが実感できます。0.5GFLOPSがやっとこですね。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。