並列プログラミングの概念: CUDAとOpenCL
同じ機械、同じCPU、同じGPU、同じプログラミング言語で、
自分のプログラムがもっと高速に実行できること、見たくありませんか?
最近、多くの並列プログラミングのフレームワークが登場してきている。 世界中のプログラマが、使いやすさの面をかんがえて、 Python、Ruby、Javascriptといったスクリプト言語 のラッパも開発されて、GitHubとかに載ってたりします。
- Haskell: FFI binding to the CUDA interface for programming NVIDIA GPUs
- Ruby: SGC-Ruby-CUDA
- Python: PyOpenCL
未だに並列プログラミングを知りませんといった方々には、並列プログラミングをやって 始めませんか?
まず、NVIDIA社が開発したCUDAアーキテクチャ。 シンプルで使いやすいと思います。それに、CUDAのSDKに付いてくるサンプルの数も豊富にあります。 もちろん、サンプルといっても、初級のレベルから最上級までのレベルが用意されています。 ただ単純にCUDAのAPIの使い方だけではなく、並列プログラミングの手順まで教えてくれたり するので、あらかじめ予習するのがお勧めです。
昔は、CUDAのアーキテクチャとSDKは(超)不便ではあったが、最新のやつだと間違いなく便利です。 例えば、昔のやつだと、カーネルは1つしか動作できなかったり、倍精度の計算はサポート されなかったので単精度の組み合わせを使ってかなり遅かったり。サンプルも多くなかったし。 最近のやつは、サンプルも豊富だし、カーネル内のカーネル呼び出し(つまり、再帰的関数呼び出し) が可能になりました。なんといっても、最近のCUDAのAPIとSDKは、使いやすいし便利です。 しかし、残念なことに、CUDAはNVIDIAのものなので、NVIDIAのGPUでしか動作できない。
FYI: 一般にはCPUがやっている計算を、GPUで計算させることは、 GPGPU(GPUによる汎目的計算)と言います。
次は、OpenCLです。Open Computing Languageの略。 当初はAppleとKhronos Groupが開発を指揮っていましたが、最近では主にKhronos GroupがOpenCL開発を リードしています。OpenCLを利用して嬉しいのは、多岐に渡るプラットフォームで動作することができる。 また、当初はC言語しかサポートされなかったが、OpenCL 1.1からC++も使えるようになりました。
NVIDIAのGPUや、IntelのCPU(とGPU両方、HD4000型以降)、AMDのGPU、ARMのCPUで動きます。 何故可能なんだ?これらのメーカーのプログラマの代表者が集まり、合同開発をしているからです。それぞれのメーカー のチップが個性的な機能で作られているが、一つのAPIを通じて利用できるのが、素晴らしいと思いません? それぞれのベンダーのOpenCLのSDKはAMD OpenCL SDK, Intel OpenCL SDK, とNVIDIA OpenCL SDKにあります。それぞれのOpenCLのSDKも それぞれのベンダーが作成したサンプルも付いています。
上記2つは僕が主に利用したものです。もちろんこの他にも、多数あります。 無料・有料の観点で分けると、
フリー: OpenMP, Intel’s TBB, Intel’s ArBB, Pthreads
有料: PGI’s Compiler with OpenACC, CAPS’ Compiler with OpenACC