今週、AMDのGary Frost氏はAparapi (A PARallel API) のαリリースを発表した。これはプログラマがGPU上で実行可能なロジックをJavaで書くことを可能にするAPIだ。GPUは極めて並列化されたハードウェアアクセラレーションチップであり、もともとグラフィックスレンダリング性能の向上のためにPCにインストールされたものだが、今やグラフィックスとは無関係な計算負荷の高いタスクにも進出している。
私たちは話のポイントをつかんでAparapiが何をするのか理解するために、Frost氏とメールで情報交換した。Frost氏はAparapiについて次のように説明した。
Aparapiを使えば、Java開発者はJavaだけでデータ並列アルゴリズムを表現できます。そのため、CUDAやOpenCLを学習したり、JNIという難題に気をもむ必要はありません。基本的に、Java開発者は ‘Kernel’ と呼ばれるベースクラスを拡張して、run() メソッドをオーバーライドすることになります。Aparapiは実行時にOpenCLが使えるかどうか判断します。もし使えるなら、あなたのデータ並列作業をOpenCLに変換しようとします。変換がうまくいけば、AparapiはGPU上でOpenCLを実行して、すべてのデータ転送の面倒を見ます。もし何らかの理由でOpenCLへ変換できなければ(あるいは、OpenCLが使えなければ)、Aparapiはスレッドプールを使って元のコードを実行します。はっきりさせておきたいのですが、私たちはJavaソースをOpenCLに変換しているわけではありません。実行時にソースコードへのアクセスは期待できません。その代わりに、ユーザのKernel実装におけるrun()メソッドからたどれるメソッドのバイトコードを分析するのです。そして、バイトコードからOpenCLを生成します。ある意味、JadやJode、Mochaによく似た動作をしますが、バイトコードからOpenCLを作る小さなライブラリがあるのです。
Frost氏は任意のJavaコードがAparapi上で実行できるわけではなく、実行できるJavaの種類には制約があると話を続けた。AparapiのREADMEによると、これらの制約とは、開発者は基本的にプリミティブ型の配列を使ったCスタイルのコードしか書けないことを意味している。オブジェクトは許されず、try-catch-finallyブロックも許されず、配列の割り当て・解放も許されない(すなわち “new” は許されない)。これらの制約はGPUの本来の機能にほぼ対応するものだ。さらに、AparapiはWindowsプラットフォームではGPUを利用できるが、それ以外のプラットフォームではJavaスレッドプールを使うことになる。
Frost氏によれば、彼のチームはJavaからGPUを使うことで「かなり容易に」速度を20倍改善することができたそうだ。もう一つの方法として、開発者はネイティブのOpenCLやCUDAとJNIバインディングを使って、もっと「劇的に」高速化することができる。OpenCLは「異種混合システムのための汎用並列プログラミング」言語標準 であり、GPUを対象としたプログラムも含まれている。CUDAもよく似ているが、これはNVIDIAのGPUに特化したものだ。私たちはJNIベースのライブラリを使った経験についてFrost氏に尋ねた。彼は次のように答えた。
初期のJavaのパイオニアはJNIを活用して、「ホストプログラミング」コードをCで実装していました。ホストプログラミングにより、私はGPUにオフロードした計算の「ハウスキーピング」について調べました。特に、デバイスのために(OpenCL/CUDAから)実際の作業をコンパイルしてデバイスへのデータ移動を調整すること、そして、コードを実行してデータを戻すことです。この「ホスト」プログラミングは冗長で細かくなり、Java開発者にとって「JNIのありがたみ」はすぐに消えてしまうことがわかりました。ありがたいことに、CUDAやOpenCLのための利用可能なJavaバインディングを使うことで、JNIをまったく使わないで済ますことができます。 私はJOpenCLとJOCL(いずれもオープンソース)を使ったことがあります。どちらも基本的に低レベルのOpenCL/CUDA呼び出しをJavaクラスにラップしてくれます。これらバインディングの開発者があなたのためにJNI作業をすべてやってくれるのです。
私たちはFrost氏に、これまで業界で見てきたGPUにぴったりのアプリケーションは何かと尋ねた。すると彼は次のように答えた。
OpenCLについて見れば、財務サービスからエネルギー探査まで、あらゆるものを見てきました(私はかつてその分野で働いていました)。地震データ解析のためにGPUを調べている人も知っています。GPUを使って計算をすることで多大な恩恵が得られるアプリケーションとしては、大規模データ解析の分野が挙げられます。
Frost氏はGPU上のプログラミングについてもっと学びたいJavaプログラマに、AMDのOpenCL ZoneやJOpenCL、Marco Hutter氏の「すばらしい」JOCLなどのホームページを訪れることを勧めた。