OpenCLの実装メモ。

- カーネルのコンパイルエラーを見つける方法
カーネルの記述が間違っていると、clBuildProgramが失敗する。clGetProgramBuildInfoを使うと、コンパイルエラーを取得できるが、もっと便利なのは、AMD APP KernelAnalyzerを使う方法。Source Codeのところに問題のソースを貼り付け、Compileボタンを押すと、エラーがある場合はCompiler Outputのところに、エラーが出力される。

- プロファイリングの方法
Code XLを使用する。新しいプロジェクトを作成し、プロファイルを取得したいプログラムを指定する。ProfileメニューからStart Profilingを実行。GPU プロファイルにはApplication TraceとPerformance Countersの2種類がある。

これはApplicatoin Traceの実行結果:


プログラム実行中に使用したOpenCL関数や、それに掛かった時間などがグラフ表示される。

これがPerformance Countersの実行結果:


使用したカーネルや、カーネルを実行したときのworkgroup sizeもわかる。

- 雑感

やっと一通りカーネルを実行できるようになった。実行時間だけをみると、CPUの5倍程度高速であるように思われるが、前後のメモリ転送が遅いので(とりわけCPU->GPU)、結局CPUで計算した方が3倍程度高速な状態。ちなみに、CPUのプログラムはVisual C++ Express 2012で64bitバイナリでO2最適化/AVX有効の場合。(VCはついに2012でExpressでも標準で64bitバイナリが出力できるようになった!)

メモリ周りの使い方がまだ適当なので、もう少し高速化できるか調査してみたい。

処理の高速化のために、AVX, SSE, Intell TBB, OpenCLと実験してみているが、AVX最適化コンパイルだけでもそこそこ早い。intrinsicsを使うのもそれほど難しくはない(コンパイラより高速にできるかは別問題として)。これらの中ではOpenCLが飛び抜けて使用が面倒。ただ、無料で分かりやすいプロファイラーが使えるのは便利。Intel命令セットで同じようなプロファイルを取りたい場合、Compose Studioという有償ソフトが必要らしい。(2012/12/26追記)どうやら、Intel Graphics Performance Analyzersを使用すれば、Code XLと同様のプロファイリングがとれるっぽい(自分が使用しているPCはSandy Bridgeのため、OpenCLをGPUで実行できないので、これは試していない)。

- FPGAでOpenCL

AlteraがFPGAでOpenCLを実装するという発表があったが、個人的にはちょっと微妙だと思う。既に世の中には高位合成ソフトウェアが存在しているのに、なぜわざわざOpenCLで実装する必要があるのか、と思う。

ちょっとニュースリリースで不明なのは、「ホストCPU」というのが、PC上のCPUのことなのか、FPGA上のCPUのことなのか、ということ。FPGAはPCと接続するばかりではなく、単体のボードで動作させることもある。むしろこの形態の方が一般的だろう。このような場合、OpenCLで合成した回路がPCと通信しなければ動作しない、というのであれば、意味がない。むしろ高位合成で回路を作成した方が、PCに依存しない実行環境となり望ましい。

2012/12/19追記:ホストCPUは、AlteraのWhite Paperを見る限りPCのCPUとFPGAのCPUの両方を想定しているようだ。ただし、現段階でのSDKでは、PCのCPUで実現されている様子である。

上記White Paperでは、Stratixで実装したものとGPUで実装したものの性能比較が掲載されている。Stratixという超高級FPGAを使用しても、最近のGPUと演算性能はさほど変わらないらしいことからすると、よほど電力性能(Performance/Watt)が重要であるのでない限り、自分としては存在意義があまり感じられない。しかも、White Paperでは"Comparable GPU"としか書いておらず、具体的にどのGPUと比較しているのかも不明。これが2,3万円で買えてしまうボードであれば、コストパフォーマンスが良いとは言えない。

逆に、OpenCLのホスト側がFPGA上のCPUで動作し、かつSDKが安価に提供されるのであれば、"貧乏人のための高位合成ソフトウェア"になりそうではある。

Comments