メモ

Note on OpenCL SDKs

ICDとその設定について

OpenCLには、SDKを実行時に切り替えることのできる、Installable Client Driver (ICD) Loaderという仕組みがある。 コンパイル時にリンクされる”libOpenCL.so”には、エントリーポイントのみがあり、 ICDによって各SDKのライブラリ実体が動的にリンクされる。 そのため、ランタイムは実体ライブラリをサーチするパスを”/etc/OpenCL/vendors”から読み込む。 ここに、ライブラリへのパスを書いただけのファイルを置いておけばいい。 下記のSDKのどれか(Appleは異なる)をインストールすると、 “/etc/OpenCL/vendors/amdocl64.icd”などのファイルが作られる。

root権限がある場合には何も考えずに指示どおりにSDKをインストールすればよいのだが、 そうもいかない場合には、ホームディレクトリ等にもSDKをインストールすることもできる。 この場合、ICDの設定ディレクトリのは以下の環境変数で設定すればよい。

1
OPENCL_VENDOR_PATH=$(HOME)/lib/OpenCL

AMD, Intel, NvidiaのSDKはこの方法で動作することを確認している。 IntelのSDKだけは、ここにあるファイルにfullpathを書かないとだめ。

2012年3月の各社のOpenCL SDKの現状

自分で試したSDKのみ。五十音順。

AMD

最新バージョンはAMD APP 2.6である。 AMDのSDK6c6c6c6cは、OpenCLのバックエンドがCatalystというGPU用のデバイスドライバに分離されている。 そのため、SDKのバックエンドと、ある時点での最新のバックエンドには、結構なリビジョンの差がある。 GPUのバックエンドは当然Catalyst付属のものが新しい。CPUのバックエンドは。。。(調査中)

AMDのSDKは、CPUとGPUをどちらもサポートしていて、CPUの種類にも特に制限はない。 

Apple

Lion以降のOS XにはOpenCLの開発環境が含まれている。 利用するにはXcodeのインストールも必要だろう。 AppleのSDKは、ヘッダの位置とライブラリをリンクする方法が特殊。例えば以下のように。

1
gcc main.c -framework OpenCL

AppleのSDKは、CPUとGPUをどちらもサポートしている。 手元には、2010年のMac Book Airしかないので、パフォーマンスについては不明。 あまり速くないような感じ。 

Intel

最新バージョンは1.5である。 現バージョンはCPUのみサポート。将来はIGPをサポートするらしい。 IntelのSDKの困ったところは、CPUでSSE3命令(以降)をサポートしていないと動作しないということ。 そのため、AMDのプロセッサではBulldozer以降のアーキテクチャでないと動作しない。 また、IntelのCPUで、アーキテクチャ的にはSSE3命令をサポートしていても、 Linuxのカーネルが古くて、SSE3以降の命令を認識しない場合動作しない。

自動ベクトル化をしてくれるのが売り。

NVIDIA

NVIDIAのSDKはCUDAのSDKに含まれている。リンクするライブラリの実体も”libcuda.so”だったりする。 NVIDIAのSDKはNVIDIAのGPUのみサポートしている。

現時点での問題は、Fermiアーキテクチャでの共有メモリの設定である。 Fermiでは、共有メモリと1st cacheの容量が調整可能になっていて、 それぞれの容量を48/16KB or 16/48KBと切り替えることができる。 CUDAではコンパイルオプションで切り替えることができるようであるが、OpenCLではそのやり方がいまだ不明である。

CUDAとOpenCLの間には性能に差がある、というのが定説的な感じであるが、 最近はギャップが小さくなってきてるようである。 例えば Keeneland Workshop at GTのこのスライド で、色々なカーネルをCUDAとOpenCLで実装して性能比較している。 一部のカーネルを除いて、性能差はなくなってきている。 上記、共有メモリと1st cacheの容量変更ができるようになれば、さらに差はなくなるはずである。 

OpenCLの本

OpenCL入門 - マルチコアCPU・GPUのための並列プログラミングは、学生用に買った日本語の本。既に少し古いが、もうじき新版が発売される。

OpenCL in Action: How to Accelerate Graphics and Computationsは、SC11に行った時に、どっかのブースで展示してあった。その場で買うつもりが、気づいたら売り切れていたので、帰国後注文した。cl.hppの使い方はこれで学んだ。わかりやすい。

Heterogeneous Computing with OpenCLは、買ったばかり。著者はAMDの人達で、AMDのGPUアーキテクチャについての解説がChapter 6にあるのが珍しいかも。