• 検索結果がありません。

既存の CPU 向け並列化プログラミング環境と GPGPU

3.4 GPUPC GEMM Library の評価

4.1.1 既存の CPU 向け並列化プログラミング環境と GPGPU

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 78

利用可能になると考えられる.

そこで,既存のCPU向け並列化プログラミング環境を用いたGPUプログラミン グを提案する.以下本節では,既存のCPU向け並列化プログラミング環境のいくつ かについて,現在の一般的なGPUとの対応付けを考える.さらにGPUアーキテク チャの1つであるCUDAを対象として,既存のCPU向け並列化プログラミング環 境とGPUプログラミングとのより具体的な対応付けの検討を行う.

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 79

図 35: 典型的なGPUのハードウェア構成

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 80

るCPU-GPU間での通信と演算の流れは,CPUがメインメモリ上のデータ(変数・

配列)をGPU上のメモリへ転送し,GPUが(もしくはCPUとGPUがそれぞれ)演 算を行い,CPUからGPUへの指示によってGPU上のメモリからメインメモリへ 演算結果などのデータが転送されるというものである.

こうした一連の処理を行うにはGPUの実行制御やメインメモリとGPU上のメモ リの間での通信が必要である.通信や制御を既存のCPU向け並列化プログラミン グ環境を用いて記述することができれば,GPUプログラミングが容易に行えるよう になると考えられる.

さらにGPUの持つ高い並列実行性能を活用するには,GPU内部の並列性を利用 する必要がある.ただしGPUにどのようなメモリが搭載されているかや搭載され ているメモリがCPU側からどのようにアクセスできるかは対象とするGPUのアー キテクチャやドライバなどに依存する.

GPU上の演算器やメモリを用いた並列処理を既存のCPU向け並列化プログラミ ング環境を用いて記述することができれば,GPGPUプログラミングが容易に行え るようになると考えられる.

一方でCPU向けの並列化プログラミングについては,CPU内のSIMD演算器,

SMP (共有メモリ型並列計算機,Symmetric Multiple Processor/Shared Memory Multiprocessor),マルチコアCPU,PCクラスタなど既に様々な環境に向けて数多 くの研究が行われている.またアプリケーションプログラマが明示的に並列性を記述 する際に用いられている手法やライブラリとしては,SIMD関数,pthread (POSIX Threads)などのスレッドライブラリ,OpenMP,MPIをはじめとした通信ライブラ リなどが広く利用されている.そこで,GPGPUにおける並列処理の記述に対する これらの並列化プログラミング環境の適用可能性を考えることにする.

SIMDプログラミング

複数のデータに対して同時に同じ演算を行うSIMD演算は,マルチメディア処理 をはじめとした様々な処理の高速化に有効である.SIMD化についてはコンパイラ による自動SIMD化によってもある程度の性能が得られることが知られている[92]

が,これを利用するにはコンパイラのSIMD化変換パターンに適したコードを書く

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 81

必要があることから扱いやすいプログラミング環境であるとは言い難く[93],イン ラインアセンブラやSIMD関数を用いたプログラミングが行われている[94, 95].

SIMD演算は細粒度のデータ並列処理に適している.そこで,GPU内部の各演算 器をSIMD演算ユニットと見なしてデータ並列演算と対応付けることで,GPU上 の演算器による並列処理をSIMD関数などを用いて記述できるようになると考えら れる.

スレッドライブラリを用いたマルチスレッドプログラミング

近年普及が進んでいるマルチコアCPUを含めた共有メモリ型並列計算機では,ス レッドを用いた並列化が広く行われている.特に共通化されたスレッドライブラリ pthreadは多くの計算機環境(OS)に対応しているため広く普及している.

スレッドプログラミングでは複数のスレッドが共有メモリを利用して並列処理を 行うことから,GPU上の演算器間の並列性や演算器群間の並列性の記述との適用性 が高いと考えられる.

一方で,CPUからGPUに対する演算の指示をスレッドプログラミングの手法で 記述することも考えられる.スレッドプログラミングでは一般的に関数単位でのス レッド割り当てを行う.そこで,スレッドプログラミングにおけるスレッド化対象の

関数をGPGPUプログラムにおいてはGPUに実行させる,といったプログラミン

グモデルの対応付けが考えられる.ただし対応付けを行うには,CPUとGPUは独 立したメモリ空間を持つため,スレッド内部で利用するデータをCPU-GPU間で送 受信する必要がある.そのためにはコンパイラによる静的なデータ参照の解析を行 うか,可能であるならばSDSM[96, 97]のようにメモリアクセスのたびにCPU-GPU 間でデータを送受信する機構を提供する必要があると考えられる.

OpenMPを用いた並列化プログラミング

pthreadなどのスレッドライブラリを用いた並列化をより容易に記述する方法と

して,OpenMP[98]を用いた並列化が利用されている.OpenMPによる並列化プロ グラミングは逐次プログラムに指示子を追加することによって行われ,特にループ の並列化など共有メモリを用いた典型的な並列処理を容易に記述することができる.

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 82

OpenMPの典型的な対象問題である共有メモリを用いたループの並列化をGPGPU

と対応付ける場合,GPU上には階層的な共有メモリが存在するため,演算器間で の並列処理をOpenMPと対応付けて記述することや,演算器群間での並列処理を

OpenMPと対応付けて記述することが考えられる.またマルチスレッドプログラミ

ングと同様に,実行前や実行時に並列処理部で利用するデータを特定しCPU-GPU 間で送受信することができれば,逐次実行部をCPUで実行し並列実行部をGPUで 実行するようなOpenMPとGPUプログラミングとの対応付けが可能になると考え られる.

通信ライブラリを用いたマルチプロセスプログラミング

分散メモリ型並列計算機やPCクラスタなどの共有メモリを持たない環境におい て,また共有メモリ型並列計算機においてもきめ細かい通信制御によって高い性能 を得るために,通信ライブラリを用いたマルチプロセスプログラミングによる並列 化が行われている.特にMPI[99, 100] は様々な実行環境向けの実装が行われており 広く普及している.

通信ライブラリを用いた並列化はSIMD演算やマルチスレッドプログラミングと 比べてやや粒度の大きな並列化に用いられることが多いため,GPGPUにおいては GPU上の演算器群間における並列性の記述に利用することでGPGPUとマルチプ ロセスプログラミングの適切な対応付けが行えると考えられる.一方でGPU上に は比較的大容量の共有メモリが存在している.既存の共有メモリ型並列計算機にお いては,共有メモリが利用可能であってもMPIを用いて細かい通信制御を行うこと で並列化オーバヘッドが削減でき(OpenMPと比べて)高い性能が得られることが知 られており,GPGPUにおいてもCPUと同様に共有メモリと通信ライブラリを用い た並列化記述を利用する価値があると考えられる.

さらに,CPU-GPU間でのデータ送受信に通信関数を利用することも考えられる.

CPUとGPUはそれぞれ独立したメモリを持つため,GPUを計算ノードと見なした うえで分散メモリ型並列計算機向けの通信ライブラリと同様のインターフェイスを 用いてCPU-GPU間のデータ通信を記述し,CPUとGPU上の演算器群での通信を 行いながら処理を行うプログラムが作成できる可能性がある.しかしながら,GPU はCPUと並列に演算を行う事ができるものの,演算の開始やCPU-GPU間でデー

4.1 既存のCPU向け並列化プログラミング環境を用いたGPGPUプログラミング

の提案 83

タの送受信を行うはCPUによる制御が必要なため,既存のCPU向けプログラムと 同様の記述や動作が行えない可能性もある.

以上のように,GPGPUの持つ並列性は既存のCPU向け並列化プログラミング 環境を利用して記述できることが期待できる.

さらに,CPU-GPU間での通信をMPIで記述し,GPU上の演算器群間での並列 処理をOpenMPで記述し,演算器群内の演算器間での並列処理をSIMD関数で記述 するなど,既存のCPU向け並列化プログラミング環境を複数組み合わせて利用す ることも考えられる.これによりGPUの持つ並列性を適切かつ容易に記述できる 可能性がある一方,複数の並列化プログラミング環境を組み合わせたプログラミン グはアプリケーションプログラマにとっての実装の手間を増加させてしまうこと考 えられる.