4.2 OMPCUDA : CUDA 向け OpenMP の提案と実装
4.2.1 全体の構成
本項ではOpenMPとCUDAの並列実行モデルおよびメモリモデルのより具体的
な対応付けを検討する.
前節で述べたように,既存のOpenMPは指示子によって指定された並列実行部
4.2 OMPCUDA : CUDA向けOpenMP の提案と実装 99
のみを複数のスレッドで並列実行し,それ以外の部分は逐次実行する.逐次実行部 と並列実行部では,主記憶上に確保した共有メモリをスレッド間で共有する.そこ でOMPCUDAでは,並列実行部のみをGPUで実行し,他の部分はCPUで実行す ることとする.つまり,既存のOpenMPがスレッド単位で並列実行を行うのに対 して,OMPCUDAではCUDA Thread単位で並列実行を行うこととなる.この際,
GlobalMemoryを共有メモリと見なし,多数のCUDA Threadを用いて並列計算を 行う.CUDAを用いて高い性能を得るにはSharedMemoryを活用することが重要と されているものの,OpenMPに適した高い並列性を持つ対象問題であれば並列実行 によりある程度高い性能を得られ,OMPCUDAの有用性が確認できるものと考え られる.
以上に基づくOpenMPとOMPCUDAの実行モデルとメモリモデルの対応付けを 図42に示す.
OMPCUDAの実装は,既存のOpenMP処理系Omni OpenMP Compiler version 1.6[102] (以下Omni)をベースに行った.これによりOpenMP指示子の解釈などCPU
向けのOpenMPと共通の処理の再実装を避けており,プログラム変換機構および新
しい実行時ライブラリを実装することでOpenMPプログラムの並列実行部をCUDA 対応GPU上で実行可能としている.
OmniとOMPCUDAの関係およびOMPCUDAの構成を図43に示す.
OmniがOpenMP指示子の挿入されたソースコードから並列化された実行ファイ
ルを生成するための手順は以下の通りである.
1. OpenMP指示子の挿入されたソースコードを入力として受け取り,各言語に
対応したFrontendによってOpenMP指示子の入った中間コードへと変換する.
2. OpenMP指示子の挿入された中間コードに対して,OpenMPモジュールを用
いてOpenMP指示子の解釈を行い,Omniの実行時ライブラリ呼び出しを含
む中間コードを生成する.この際,OpenMPにおける並列実行部の指定はブ ロック単位で行われるのに対して,Omniの中間コードにおける並列実行部は 関数として分離させられ,並列実行部関数をスレッドに割り当てるOmniの実 行時ライブラリ関数によって呼び出されるように書き換えられる.
3. 中間コードをC言語プログラムに変換(デコンパイル)し,バックエンドコンパ
4.2 OMPCUDA : CUDA向けOpenMP の提案と実装 100
図 42: OpenMPとOMPCUDAの実行モデルとの対応付け
4.2 OMPCUDA : CUDA向けOpenMP の提案と実装 101
図 43: OmniとOMPCUDAの関係およびOMPCUDAの構成
4.2 OMPCUDA : CUDA向けOpenMP の提案と実装 102
イラを用いてコンパイルし,Omniの実行時ライブラリとリンクして実行ファ イルを生成する.
このように,Omniによって分離させられた並列実行関数は,実行時ライブラリ の並列実行開始関数によってスレッドに割り当てられて並列実行されることとなる.
一方でCUDAにおけるGPU上での並列処理も関数単位であり,CPUからの指示に 従いGPU上の多数の演算器で同時に同じプログラムを実行する.ただし,演算の 前にCPUからGPUへ必要なデータを送信し,また演算の後にはGPUからCPUへ 結果を送信する必要がある.
そこでOMPCUDAでは,“Omniの並列実行開始関数呼び出し”を“CPUからGPU へのデータ送信,GPUへの演算実行開始指示,GPUからCPUへのデータ書き戻 し”の一連の処理に置き換えるプログラム変換機構を実装した.このプログラム変 換機構は,プログラムを調査しCPU-GPU間で送受信する必要があるデータを自動 的に送受信する機能を持つ.ただし,ポインタを含む構造体など単純に送受信でき ないデータを利用しているプログラムには対応していない.
OMPCUDAでは,処理の対象をOpenMP指示子の挿入されたソースコードでは
なく,Omniによって指示子の解釈が行われ実行時ライブラリの呼び出しに変換さ れた中間コードとした.Omniの中間コードはXcodeと呼ばれる専用の中間表現に よって記述されており,Omniに含まれるExc Java tool kitによって解析・書き換 え・C言語コードとの相互変換を行うことができる.OpenMP指示子の解析や実行 時ライブラリへの変換を行うOpenMPモジュールもExc Java tool kitの一部として 実装されている.OMPCUDAのプログラム変換機能もその機能の多くをExc Java tool kitの追加モジュールとして実装しているが,CPU向けのコードとGPU向けの コードを別々にコンパイルするための処理やCPU-GPU間のデータ転送に向けたプ ログラム解析のために,元々のOmniに組み込まれている各種モジュール(Javaの クラス)に対する機能追加や変更も行っている.
CUDA用実行時ライブラリは,Omniの実行時ライブラリが持つ機能をCUDA向 けに再実装したものである.
4.2 OMPCUDA : CUDA向けOpenMP の提案と実装 103