34. GPUを使用したサンプルワークフロー

ワークフローデザイナで、GPU(CUDA)を使うプログラムを動かすワークフローについて記述する。 動かしているソルバーは、nVidiaのCUDAサンプルに付録している行列積計算のプログラム(matrixMul)である。

34.1. 理論

行列の積を求める計算は、要素ごとに乗算と加算を繰り返し、O(N^3)の計算量になり、 メモリ使用量は、O(N^2)のオーダーで消費し、全要素にアクセスが必要な事から、 計算量とメモリバンド幅を同時に使うため、ベンチマークソフトとして使われることがしばしばある。 今回のサンプルワークフローとして、行列積計算プログラムを使用することにした。

GPUボードは、Quadro K620を想定していて、行列サイズは、4800×4800の固定値でコンパイルしたものを使用している。

GPUでの計算時間は約2秒、検算のためのCPU計算時間は、約30分を想定している。

34.2. GPGPU_testワークフローの利用

GPGPU_matmal と言うツールをワークフローデザイナのデザイン画面にドラッグ&ドロップする。

../_images/gpgpu_wf_01.png

図 779 GPGPUテストワークフロー

他のツールとの連携を想定していないので、単体ツールのワークフローとなる。

34.3. 作成(入力のデータ構造を含む)

不要。

ツールとしては、入力ポートが存在するが、内部的には受け取らない。

34.4. 出力

ファイルとしての出力は行わない。

標準出力に以下のような出力を行う。

[Matrix Multiply Using CUDA] - Starting...
GPU Device 0: "Quadro K620" with compute capability 5.0

MatrixA(4800,4800), MatrixB(4800,4800)
Computing result using CUDA Kernel...
done
Performance= 35.87 GFlop/s, Time= 6166.407 msec, Size= 221184000000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
done.

34.5. GPU使うツールを複数個Torque実行した場合

GPGPUテストワークフローのツールは、開発環境の以下のディレクトリに配置している。

/home/misystem/assets/modules/gpgpu_test

このディレクトリ内の wf_run.sh がワークフローからの入力を受け付けるシェルスクリプトになっている。

matrixMul がnVidiaのサンプルから、行列サイズを変更した CUDA 実行ファイルだ。

Torque実行するスクリプトは、pbs_run.sh になっていて、設定は、1ノード1プロセス動作を指定している。 キューは、ex_queue を指定して、ワークフローデザイナと同一のキューを指定している。 複数回 qsub するために、multi_run.sh を作成して、pbs_run.sh を実行するようにしている。 デフォルトでは、0から10までの11個のジョブがキューに登録される。

multi_run.sh を使用し、GPUジョブを複数投入したときのqstatの様子を、 図 780 に示す。

../_images/img436.png

図 780 ジョブを11個投入したときのqstat(一部)

図 780 に示したとおり、3番目以降の pbs_run.sh がステータスCの終了になっている。

3番目の pbs_run.sh に残されているエラーメッセージを以下に示す。

MatrixA(4800,4800), MatrixB(4800,4800)
cudaMalloc d_C returned error out of memory (code 2), line(181)
done.

メモリがGPU上に確保できなかったというエラーメッセージが記されている。 その時のGPUの状態を、nvidia-smiコマンドを使用して調査した結果を、 図 781 に示す。

../_images/img435.png

図 781 nVidia SMIコマンドでGPUの状態を確認した画面

既に、2000MB中1700MB以上のVRAMが割り当てられていて、追加で、300MBのVRAMを割り当てられる状況にないことが分かる。

この時の計算ノードのTOPで確認した実行中のプロセスを、 図 782 から 図 784 に示す。

../_images/img437.png

図 782 cdev12のプロセス状況

メモリの使用量の都合で割り当てられた2プロセスの実行を確認できる。

../_images/img438.png

図 783 cdev13のプロセス状況

../_images/img439.png

図 784 cdev14のプロセス状況

cdev13、cdev14のTOPには、「matrixMul」の文字が現れることはなかった。 なので、Torqueはcdev12にすべての pbs_run.sh を割り当て、GPUのメモリが確保できなかった matrixMulプロセスが、 順次終了していき、11個のジョブがcdev12内で処理されたと考えられる。

34.6. まとめ

ワークフローデザイナ上からCUDAを使用するアプリケーションを動作させることが可能だと確認ができた。

一方で、GPUを複数のツールやワークフローで使用する場合、Torque側でGPUのリソース状況を知ることができないため、 全部同一ノードにジョブを割り当ててしまうため、GPUを使用した計算に失敗することが分かった。

なので、GPUを使うワークフローは、GPUの状態をモニターできるTorqueを使うか、利用者の話し合いでGPUを使用するジョブの投入を行う必要がある。

34.7. 課題

現在のTorqueの設定では、1つのノードにすべてのGPUソフトを割り振ってしまうため、 デザイナを使用して多くのGPUを使用するワークフローを、並列で実行することができない。

CPUの検算を高速化するには、OpenMPなどで、CPUコードも並列化を行う必要がある。