3.3 GPUPC GEMM Library : CPU と GPU を用いて問題分割・並列実
3.3.2 ライブラリの設計と実装
本項ではライブラリの設計と実装について,以下のことを述べる.
1. GPUを用いた行列積和計算の実装方法
2. CPUとGPUによる問題分割・並列実行の実装方法 3. チューニングスクリプト
4. 複数CPUや複数GPUを搭載した計算機システム向けの実装 5. 倍精度浮動小数点演算への対応
6. メモリ容量に基づく問題サイズの制限
7. 行列データの転置やORDERといったBLASのパラメタへの対応
なお,実装にはOpenGLとGLSLを用い,実行環境はLinuxとした.これは評価 に用いるHPLベンチマークの実行環境としてLinuxが適していることおよびLinux 向けのグラフィックスプログラミングにはOpenGLとGLSLが適していることによ る選択である.
GPUを用いた行列積和計算の実装方法
GPUPC GEMM LibraryにおけるGPU を用いた行列積和計算については,Fata-halianらによる行列積の実装[86]を用いた.
この実装は行列Cの縦横サイズに対応した大きさの描画先テクスチャを用意し,
ピクセル毎にシェーダプログラムを用いて行列積和計算を行うものである.図19に 示すように長さ4のベクトルをまとめて処理する高速化手法を取り入れた実装では
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 50
あるものの,図20のように対象行列の転置状態によっては手法が有効に機能せず高 い性能が得られない.そのためシェーダによるベクトル演算が行いにくい問題につ いては,転置してからGPUへ転送し,計算結果を取得後に転置を戻すという実装 を行った.また行列の縦横サイズが4の倍数でない場合はパディングも行っている.
なおこれらの処理は計算時間に影響を及ぼさない程度の十分に短い時間で行うこと が可能であり,性能に有意な影響を及ぼすことがないことが確認できている.
CPUとGPUによる問題分割・並列実行の実装方法
行列積和計算はデータの参照パターンが単純なため,問題分割も容易に行う事が できる.GPUPC GEMM Libraryでは,CPU-GPU間でのデータ転送量が増えない ようにすることと,CPUとGPUでの問題担当割合を容易に変更できることを考慮 し,図21に示すような方法で問題分割を行うことにした.
この問題分割方法では分割割合“m”を変更することでCPUとGPUの問題担当 割合を容易に変更することができるため,CPUとGPUの性能バランスに合わせて 問題分割割合を容易に調整することができる.
行列積和計算は反復計算等を必要としない単純な問題であるため,3.2節を踏まえ て図22に示すような設計とした.
ライブラリ関数を実行する際のライブラリ内における処理の順序は以下の通りで ある.
1. 初回の実行時のみGPUの初期化とシェーダプログラムの読み込みを行う.
2. 引数として与えられた問題サイズを元に,CPUのみで計算を行うかCPUと GPUを用いて並列計算を行うかの判定を行う.CPUのみで計算を行う場合は 3へ,並列計算を行う場合は4へ.
3. ATLASの行列積和関数を実行して値を返す (関数終了).
4. 問題分割割合を決めたうえでGPUに対するデータ転送と描画指示を行う.
5. GPUが描画処理を行っている間にATLASを用いてCPUによる計算を行う.
6. GPUの計算結果を取得し,CPUと GPUの計算結果を統合して返す (関数 終了).
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 51
図 19: ベクトル演算を利用した行列積の例
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 52
図 20: ベクトル演算が利用できない行列積の例
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 53
図 21: 問題分割方法
ここで問題となるのは,CPUのみで計算を行うか,CPUとGPUを用いて問題分 割・並列実行を行うかの判定基準である.既に述べたように,対象問題のデータ規 模が小さい場合にはCPU単体で実行した方が高い性能が得られる可能性がある.そ こでGPUPC GEMM Libraryでは,問題分割の際には関数の引数として与えられた 問題サイズを確認し,問題サイズが閾値より小さい場合には全てをCPUに割り当 て,それ以外の場合に問題分割・並列実行を行うこととした.
チューニングスクリプト
CPUのみで計算を行うかCPUとGPUで問題分割・並列実行するかの閾値につい ては,CPUとGPUの性能バランスに依存することが考えられる.そこでGPUPC GEMM Libraryでは,閾値となる問題サイズやCPUとGPUでの問題分割割合を外 部ファイルで指定し問題分割機構のふるまいを指定できるようにした.また,閾値 と適切な問題分割割合を求めるためのチューニングスクリプトを作成した.
ここで作成したチューニングスクリプトは,以下のような手順で適切な閾値と問 題分割割合を求めるものである.
1. 適当な問題サイズ (初期値では1024) の正方行列に対して,CPUとGPUによ る問題分割割合を10%ずつ変更しながら行列積和計算を行い実行時間を測定 する.
2. 1で最も高い性能を得られた問題分割割合の前後において,更に細かく分割割
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 54
図 22: ライブラリの設計
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 55
合を指定し直して実行時間を測定する.(初期値では-20%から+20%まで5%刻 みで測定.)
3. 2で最も高い性能を得られた問題分割割合を最適な問題分割割合と見なす.
4. 問題サイズを変更しながら (初期値では256から3072まで256刻み),3で求 めた問題分割割合を用いた場合とCPUのみでの実行時間を比較する.
5. CPUのみより高い性能を得られる問題サイズの下限を閾値と見なす.
この方法では問題サイズが閾値を超えたものは全て同じ問題分割割合となってしま う.しかしながら,本章の実験環境を含むいくつかの実験環境を用いて性能評価を 行ったところ,閾値以上の問題サイズにおける最適な問題分割割合はほとんどがプ ラスマイナス10%以内に収まっており常に良い性能が得られたため,このような方 法を採用した.今後様々な実験環境で性能確認を行い,チューニング方法を改良す る余地はある.
なお,実行時間が0.01秒未満の問題については,仮に並列実行による高速化が得 られるという出力が得られた場合でも絶対的な実行時間が短すぎて問題分割・並列 実行の効果が期待できないと考えられるため,CPUのみで実行するべきであると判 断している.
複数CPUや複数GPUを搭載した計算機システム向けの実装
前項で述べたように,複数CPUや複数GPU向けの実装にはいくつかの方法が考 えられる.ここではマルチスレッド対応のCPU向け並列計算ライブラリと,共有メ モリ (shm, mmap)およびunix socketを用いたGPUの制御による複数CPUや複数 GPU向けの実装を行った.
複数CPU (マルチコアCPU) への対応はマルチスレッドに対応したATLASに行 わせることにした.これは,ATLASのマルチスレッド実行への対応は古くから行 われており,手動で問題分割を行うよりも良い性能が得られる可能性が高いためで ある.
複数GPUへの対応については,forkを用いたマルチプロセスプログラミングに よって複数GPUの制御を行うこととした.プロセス間で行列データを共有する必
3.3 GPUPC GEMM Library : CPUとGPUを用いて問題分割・並列実行を行う
行列計算ライブラリ の設計と実装 56
要があるため,shmとmmapを用いた共有メモリを利用することとした.さらに,
unix socketを用いたプロセス間の通信も行っている.プロセス間の通信は,問題分 割終了時に共有メモリの更新完了および描画開始を指示する際に利用している.ま た,CPUの計算が終わる前にGPUの結果取得処理が始まりCPUがブロックされ てCPUの計算時間が伸びてしまうのを避けるため,計算結果取得のタイミングを 指示するのにも利用している.
以上を元に作成した複数CPU・複数GPUに対応したGPUPC GEMM Libraryの 構造を図23に示す.
倍精度浮動小数点演算への対応
2008年末の時点では最新の一部のモデルを除いた多くのGPUは倍精度浮動小数 点演算に対応しておらず,倍精度浮動小数点演算に対応しているGPUもその性能 は単精度浮動小数点演算と比べると著しく低い.またグラフィックスAPIやシェー ダ言語も倍精度浮動小数点演算に対応していない.その一方で数値計算アプリケー ションなど行列積和関数を利用するアプリケーションには高い演算精度を求めるも のが少なくはない.
そこで本研究では,単精度浮動小数点向けの行列積和関数SGEMMだけではなく,
倍精度浮動小数点向けの行列積和関数DGEMMも作成した.このDGEMMはAPI とCPUが担当する部分のみ倍精度で計算し,GPUが担当する部分は単精度に精度 を落として実行するという,形式的なDGEMMである.そのため演算精度に問題が あるものの,既存のDGEMMを用いたアプリケーションに対して形式的な適用実験 を行うことが可能となっている.
演算精度を改善し演算精度確認をパスするための方法としては,複数の単精度演 算を行うことで倍精度演算と同等の演算精度の演算を行う方法が挙げられる.これ は本アプローチの提案とは直接関係のない問題であるため,ここでは扱わない.演 算精度に問題がある性能評価でも,本アプローチの中心であるGPGPU環境を容易 に利用できることと常に高い性能を得られることを否定することにはならず,意味 があると考えられる.