2.3 プログラミング環境に関する研究の動向
2.3.1 GPU 向けのプログラミング環境
GPGPUプログラミングが難しい大きな要因として,ハードウェアアーキテクチャ
への依存性が高い専用の言語やライブラリを用いる必要があることが挙げられる.
ハードウェアアーキテクチャや言語仕様について学習する手間を削減しGPGPUを 容易に利用できるようにするには,ハードウェアアーキテクチャへの依存性が低く 汎用性・抽象度の高いプログラミング環境が必要である.そこで近年では,ハード ウェアアーキテクチャに依存しない新たなプログラミング環境に関する研究がいく つか行われている.これらの研究の中から本項では,ストリームプログラミング言 語,OpenCL,コンピュータビジョンアプリケーション用のプログラミング環境の3 つについて確認する.
ストリームプログラミング言語
ストリームプログラミング言語とは,“「ストリーム(stream)と呼ばれる入力デー タ」に対して「カーネル(kernel)と呼ばれる演算操作」を作用するものとみなすス トリーミングモデル” (図7)に基づく処理 (ストリーム処理)を記述するためのプロ グラミング言語である.近年,GPUに適しておりGPGPUによる高速化が期待で きる問題としてストリーム処理が注目されており,GPU向けストリームプログラミ ング言語の研究が行われている.以下にストリームプログラミング言語の例をいく つか挙げる.
米Stanford UniversityのBrookGPU [57] は,既存のC言語を元に拡張を加えた 言語仕様といくつかのライブラリ関数を提供するオープンソースのストリーミング
2.3 プログラミング環境に関する研究の動向 21
図 7: ストリーミング言語の概念
言語である.BrookGPUを用いたプログラムの例を図8に示す.この例では,GPU 上で実行される並列計算部 (カーネル) が関数として独立に記述されていることや,
カーネルの実行前後でstreamReadおよびstreamWriteという関数を用いて明示的 に入出力の指定が行われていることが確認できる.図中のカーネルでは2つの変数 を加算してもう1つの変数への代入を行っているが,各変数は配列であり,配列の 各要素に対する演算がGPU上の多数の演算器によって独立に並列処理される.
BrookGPUはカーネルを実行するバックエンドとしてDirectX9,OpenGL,CPU,
CTMに対応している.AMD社がBrookGPUを元にして自社のGPU向けのストリー ミング言語Brook+[58]を開発しているが,これはBrookGPUのCTMをバックエ ンドとした実装をベースにしていると考えられる.
加RAPIDMIND社のRapidMind[59]は,加University of Waterlooで開発された オープンソースのメタプログラミング言語Sh[60]を元にしたストリーミング言語で ある.RapidMindを用いたプログラムの例を図9に示す.RapidMindもBrookGPU と同様にカーネルとカーネルへの入出力を明示的に指定していることが確認できる 一方で,BrookGPUによるカーネルの記述が既存のC/C++言語における関数の記 述に似た形式で行われていたのに対して,RapidMindによるカーネルの記述はより 独特な記述によって行われていることがわかる.
RapidMindの特徴として,実行環境としてCPUやGPUだけではなくCellにも 対応している点が挙げられる.そのため単一の言語を用いてCPU・GPU・Cell向け のプログラムを記述可能であり,アプリケーションプログラマにとっては実行環境 ごとにプログラミング言語を習得し直すという大きな手間が削減できると言える.
東北大学のSPRAT[61]は,実行時環境に特徴があるストリーミング言語である.
本研究のアプローチ1 (3章) で述べているように,GPGPUにおいては対象問題の
2.3 プログラミング環境に関する研究の動向 22
// カ ー ネ ル
k e r n e l void k f u n c (f l o a t x<>, f l o a t y<>, out f l o a t z<>){ z = x + y ;
}
i n t main ( ){ f l o a t a<100>;
f l o a t b<100>;
f l o a t c<100>;
// 入 力 ス ト リ ー ム の 指 定 streamRead ( a , d a t a 1 ) ; streamRead ( b , d a t a 2 ) ;
// カ ー ネ ル の 実 行 k f u n c ( a , b ) ;
// 出 力 ス ト リ ー ム の 指 定 s t r e a m W r i t e ( c , r e s u l t ) ; return 0 ;
}
図 8: BrookGPUを用いたプログラムの例
2.3 プログラミング環境に関する研究の動向 23
i n t main ( ){ // カ ー ネ ル
Program k f u n c=BEGIN{ In<V a l u e 3 f>x , y ; Out<V a l u e 3 f>z ; z = x + y ; }END;
// 入 出 力 ス ト リ ー ム の 指 定 Array<1 , V a l u e 3 f>a ( 5 1 2 ) ; Array<1 , V a l u e 3 f>b ( 5 1 2 ) ; Array<1 , V a l u e 3 f>c ( 5 1 2 ) ;
// カ ー ネ ル の 実 行 c = k f u n c ( a , b ) ; return 0 ;
}
図 9: RapidMindを用いたプログラムの例
計算量や並列度と,CPUとGPUの性能バランスによって,対象問題をCPUで実 行した方が高い性能が得られる場合とGPUで実行した方が高い性能が得られる場 合とがある.SPRATの実行時環境はカーネルをCPUとGPUのどちらで実行した 方がより高い性能が得られるかを性能モデルや実測値から判断し,より高い性能が 得られるハードウェアを選択して実行するという機構を有している.SPRATのプ ログラム記述方法はBrookGPUに近いものとなっている (図10).
OpenCL
OpenCL Working Groupが策定を行っているOpenCL[62]は,C言語をベースと した並列処理向けのプログラミング環境である.OpenCLはGPUだけではなくや マルチコアCPU,Cell,DSP (Digital Signal Processor)など様々なハードウェアに おける並列処理を統一的に記述可能とすることを目指している.
OpenCLは新しいプログラミング環境であり本論文執筆時点では対応するハード
ウェアがまだ存在していないが,主なGPUベンダであるNVIDIA社とAMD社が それぞれCUDAとStreamによるOpenCLへの対応を表明している.そのためアプ
2.3 プログラミング環境に関する研究の動向 24
// カ ー ネ ル
k e r n e l k f u n c ( i n stream<f l o a t> x , i n stream<f l o a t> y , out stream<f l o a t> z ){
z = x + y ; }
i n t main ( ){
stream<f l o a t> s a ( 1 0 0 ) , sb ( 1 0 0 ) , s c ( 1 0 0 ) ; f l o a t a [ 1 0 0 ] , b [ 1 0 0 ] , c [ 1 0 0 ] ;
// 入 力 ス ト リ ー ム の 指 定 i n i t a r r a y ( a , b ) ; streamRead ( sa , a ) ; streamRead ( sb , b ) ;
// カ ー ネ ル の 実 行 k f u n c ( sa , sb , s c ) ;
// 出 力 ス ト リ ー ム の 指 定 s t r e a m W r i t e ( s c , c ) ; return 0 ;
}
図 10: SPRATを用いたプログラムの例
2.3 プログラミング環境に関する研究の動向 25
リケーションプログラマはOpenCLを用いることにより様々なGPU向けのプログ ラムをC言語に近い単一のプログラム記述によって行うことが可能となり,習得や 利用の手間と難しさが削減されることが期待できる.
コンピュータビジョンアプリケーション用のプログラミング環境
GPUの用途の1つとして,コンピュータビジョンアプリケーションにおける新 たな表現手法の実装や高速化[63] が挙げられる.この分野のアプリケーションは GPU本来の処理である画像描画に関する処理を多く含むが,処理内容が高度化して いるため,汎用演算と同様に習得や実装の手間や難しさが問題となっている.そこ で,コンピュータビジョンアプリケーションの開発を支援するシステムの研究開発 が行われている.研究開発されたシステムの例としては,北陸先端技術大学院大学 のEasyGPU[64]や,加University of TorontoのOpenVIDIA[65],仏University of LyonのGPUCV[66]などが挙げられる.いずれのシステムも,フィルタ処理などコ ンピュータビジョンアプリケーションで利用される処理を容易に記述可能とするこ とで,アプリケーションプログラマに対するGPUプログラミングの習得や利用の 手間と難しさの削減を可能としている.