1.2. Javaバインディング

1.2.1. JOCL(jocl.org)

警告

ソフトウェア使用ラインセンスは使用前に必ず確認するようにしてください。筆者はいかなる責任も負いませんので注意ください。

JOCLはMarco Hutterが開発するOpenCLのJavaバインディングです。

JOCL(jocl.org)はOpenCL 2.0までをサポートしています。ドキュメンテーション、更新頻度の多さ、Mavenサポート等、開発者にとって最低限必要な点は抑えています。

MavenによるJOCLのインストールはLinux、Mac、Windowsのバイナリを含めているため、実行環境に応じて設定方法を変える必要はありませんが、JNIを使用したライブラリとしては軽量性を損じます。しかし元々大きなライブラリではないため問題とはならないと考えます。

またAMDが提供するAparapiと異なり、OpenCL-C言語による実装が必要となるため、C言語ができないJava開発者にとってはC言語を学ぶ必要が生じるのはマイナスです。

筆者の考えるJOCLの最大の利点は、clBlas(AMD)、clBlastなどの数値計算ライブラリがJOCLBlas、JOCLBlastとしてサポートされている点です。

clBlasやclBlastは行列の計算ライブラリですが、これらにJavaからアクセスできるだけでもJOCLを採用する価値があると考えます。

総合的に判断すれば、パフォーマンス、ドキュメンテーション、バージョンやビルドツール、第3者ライブラリサポートについての致命的な問題点が回避されており、消去法でいくと筆者はJOCLを選択すべきと考えています。

1.2.2. JOCL (jogamp.org)

警告

ソフトウェア使用ラインセンスは使用前に必ず確認するようにしてください。筆者はいかなる責任も負いませんので注意ください。

JogAmpは高品質なクロノス規格のJavaバインディングを提供します。

JogAmpの提供するJOGLは、Processing/NASA/JMonkeyEngine、その他科学計算・シミュレーション、商用のゲーム等で採用されており、開発元という意味では信頼がおけると思います。

JavaバインディングはGlueGen経由となっており、JOGLの持つ最大の利点である抽象性、OOPという面から優れたAPIを提供しています。

ライセンスについては、

  • Creative Commons Attribution 3.0

で提供としているようです。筆者が確認した限りでは著作権の表記が必要なようですが、一般的な用途での利用には問題とはならなそうです。

しかしOpenCLについては、バージョン1.1までのサポートであり、ライブラリもGlueGenベースのため、余計なオーバーヘッドが付加されてしまいます。

GitプロジェクトもGitHubではなく、自前HPでホストしています。ドキュメンテーションは満足なものですが、現在の主流となっているバージョン1.2をサポートしない点で選択肢から外れます。

1.2.3. Aparapi

重要

Aparapiに関しては別の機会(他の書籍)に解説します。

AparapiはAMDの開発チームのOpenCLのJavaバインディングプロジェクトです。Antをビルドツールにしており、Windows/Linux/Macに応じてダウンロードします。

AparapiはJavaバイトコードをOpenCLコードに変換してGPU上で実行します。OpenCL実装がシステム内にない場合は、スレッドプールで処理します。

Aparapiは当初AMDのデバイスのみで動作されると解釈されていましたが、FAQでこれが誤解であると釈明しており、IntelやNVIDIAのGPUでも動作すると報告しています。

AMDの開発チームは継続的に機能を拡張しており、単なるプラグインツールではなく、必要であればOpenCLの下位APIを呼び出せるようになっています。

AparapiはJava開発者にとっては有用なツールではありますが、詳細を隠すために不便なことがあります。

またAparapiはOpenCLを簡略化させようとするためAparapiのコードをJNIやJOCLに移行する難易度は高くなります。

GPGPUでの計算を本格的にC言語で行う移行をする場合、類似点が少ないのでOpenCL/OpenCL-Cへ翻訳するための手間が馬鹿にならないことがあります。

真剣にGPGPUでのコンピューティングの実装を考える方については、Aparapiに先行して他のバインディングを学ぶことを筆者は推奨します。

JOCLなどのバインディングを使えるならば、Aparapiを学ぶことは容易ですが、AparapiからOpenCLやJOCLに移行するのはハードルが高いからです。

最後にAparapiについては、GPU/APUの製造元であるAMDが開発しているということは念頭にいれておくべきです。

OpenCLの実装はキャッシュの容量、CPU/GPUアーキテクチャによって変更しなければなりません。

AMD以外のデバイスでの動作はするはずですが、特に他者のデバイスでテスト・最適化をしているとはコメントしていません。

そのため、AMDのGPU/APUではAparapiが自動生成してくれるOpenCLカーネルソースコードは最適化されてはいるかもしれませんが、Intel、NVIDIA、Altera、ARMのプロセッサについては最適化されてない可能性が濃厚です。

1.2.4. JavaCL

警告

ソフトウェア使用ラインセンスは使用前に必ず確認するようにしてください。筆者はいかなる責任も負いませんので注意ください。

JavaCLの原型はJNAを経由したOpenCL Javaバインディングです。JNAはパフォーマンスの劣化の原因となるため、最新版ではJNIを経由するとされています。

JavaCLは先進的なOpenCLのバインディングのアーキテクチャの実験色にそまっており、最新のソフトウェア工学の知見がつまっています。これは他の軽量なJavaバインディング提供を趣旨とするライブラリとは趣きがことなります。

JavaCLはMavenベースのプロジェクトでもあり、線形代数等の基本ライブラリも用意されています。Javaにおける開発環境は整っていますが、2016年時点の標準実装であるOpenCLバージョン1.2をサポートしません。そのため本書での解説はしません。

読者のニーズが一定数以上あるならばJavaCL入門書の執筆する時間を惜しむつもりはありませんので、ご要望があれば筆者のメールアドレスに連絡をしてください。

1.2.5. LWJGL

LWJGLは軽量ゲームエンジンです。ゲームを開発する目的を持ち、C/C++の実装をJavaに移管するのに有意です。

  • OpenGL
  • OpenAL
  • OpenCL
  • GLFW

JogAmpのJOCL/JOGLと異なり画像処理エンジンにGLFWを採用しており、OpenCLとOpenGLを組み合わせたプログラムを組むのであれば、LWJGLの方がメンテナンスコストが少なめになると想定できます。

C/C++と変わらない設計のため、LWJGLからOpenCLに逆移管することも容易にできます。

LWJGLのビルドツールはAntベースですが、MavenについてもSonatypeリポジトリ経由でサポートしています。

しかしゲーム開発をしない層では無駄なライブラリが入っている分、無駄に重たいライブラリとなっています。

警告

ゲーム開発をされている方は、Android/iPhone/iPad等(OpenGL ES)へのポートがサポートされてないので注意ください。libgdxライブラリ、Aparapi/JOCLを組み合わせることもできます。携帯のGPUのコア数が256(Tegra X1等)になっていることを考えると、OpenCL活用がどれほどできるかは未知数ですが、GPGPUに拡張する道はあります。

1.2.6. まとめ

本書ではMarco HutterのJOCLを解説します。JOCLには数点見逃せない特徴があります。JNIでOpenCLをそのまま実装しているため、OpenCL-Java間の移行コストが低く、筆者がOpenCLコードからJavaに翻訳を最短でできたJavaバインディングはJOCLでした。

JOCLの開発者は2016年現在でもアクティブであるため、最新の技術、ライブラリが導入されています。OpenCL 2.0、clBlas、clBlast、構造体(実験バージョンのみ)のサポートをしており、ベンダーに中立的なOSSとして提供されているライブラリとしてユニークな地位を築いています。

また依存性解決についてもMavenを通じて可能であり、pom.xmlに数行を加えるだけで、開発環境が整う点は見過ごせない利点です。

Javaバインディングの中でも異種であるAparapiについては、本書ではカバーせず、別書でご案内します。

Copyright 2018-2019, by Masaki Komatsu