2.4 SIMD 型アクセラレータやプログラミング環境に関する研究と本研究
3.2.3 複数の CPU や複数の GPU を搭載した計算機システム向けの
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 40
並列実行から最も高い性能が得られるものを選択する“問題分割機構”によって適切 な問題分割を行うこととする.これによりアプリケーションプログラマは,ライブ ラリのインストール時にチューニングスクリプトを実行しておくことで,ライブラ リ利用時にはチューニングスクリプトによって得られたパラメタに基づき常に高い 演算性能を得ることが可能となる.
実際にどのようなチューニングスクリプトを作成するべきかは対象問題による部 分が大きいため,3.3節にて改めてチューニングの内容を述べる.
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 41
また別の実装例としては,CPUによる計算を複数のCPUに対応した外部の計算 ライブラリに行わせるという実装が考えられる.この場合,問題分割の際にCPUが 複数あることを踏まえた割合で分割を行い,複数CPUによる演算自体は外部の計 算ライブラリに行わせるというのは,複数のCPUを活用しつつGPUも利用できる 比較的容易な実装である (図15).例えば1CPU+1GPUではCPU 1 : GPU 1に等 分割していたものを,2CPU+1GPUではCPU 2 : GPU 1の割合に分割すればある 程度高い性能が得られると期待できる.
一方グラフィックスAPIを用いて複数のGPUを利用する方法については以下の 通りである.
DirectXでは,各種APIを利用する際に各GPUに対応するクラスインスタンス を指定する.GPU数分のクラスインスタンスを生成し,適切にパラメタ設定をして おくことで,複数のGPUを利用することができる.そのため,APIの呼び出しを GPUの数だけ増やし,問題分割時の割合等を複数GPUにあわせて変更すれば,複 数GPUに対応することができる.
一方OpenGLでは,1プロセスあたり1つのGPUしか利用することができない.
1つのプログラムで複数のGPUを扱うにはマルチプロセスプログラムを作成する 必要があり,問題分割・並列実行するためにはプロセス間でのデータ共有が必要で ある.
しかしながら,例えば2CPU+2GPUの環境において,GPUを制御するためのプ ロセスを2つ,CPUで演算を行うためのプロセスを2つの合計4プロセスを用いて 並列処理を行ったとする.この場合,図16に示すようにCPUが演算を終える前に GPUへの演算結果要求が行われてしまい,GPUを待つプロセスがCPUに負荷をか けることでCPUの演算が遅くなり,全体として実行時間が延びてしまう可能性が 高い.
この問題に対しては次に述べるような実装を行うことで解決可能であることを確 認した.
GPUに関する処理はGPU数分の子プロセスを生成してそれぞれの子プロセスに 行わせ,CPUによる演算は親プロセス上でCPU数(コア数)と同じだけのスレッド を生成しマルチスレッド実行する.この際,プロセス間通信を用いるなどして実行 順序の制御を行いCPUによる演算とCPUからGPUへの演算結果要求が同時に起
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 42
図 14: 複数CPUを用いた実装の例 1
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 43
図 15: 複数CPUを用いた実装の例 2
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 44
こらないようにする.プロセス間のデータ共有に共有メモリを利用し,共有メモリ のデータ更新を通知するためにunix socketを用いた場合の処理手順を図17に示す.
プロセス間のデータ共有については,GPUに関する処理を行う子プロセスとCPU によるマルチスレッド演算を行う親プロセスとでデータのやりとりができれば良い ため,共有メモリを利用せずにプロセス間通信で代用しても良い.
次節で述べる複数CPUおよび複数GPU向けの実装では,以上の検討結果に基づ く実装を行う.
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 45
図 16: 複数CPUと複数GPUを用いた実装の例 1
3.2 CPUとGPUを用いて問題分割・並列実行を行うライブラリの実装 46
図 17: 複数CPUと複数GPUを用いた実装の例 2