グラフィックス処理ユニットでの汎用コンピューティング( [〜#〜] gpgpu [〜#〜] )は、あらゆる種類のコンピューティングにGPUのパワーを活用するための非常に魅力的な概念です。
画像処理、パーティクル、高速な幾何学演算にGPGPUを使用したいと思います。
現時点では、この分野の2つの候補はCUDAとOpenCLのようです。知りたい:
現実世界の経験/例/戦争の話は大歓迎です。
AFAIK、 JavaCL/OpenCL4Java は、現在すべてのプラットフォームで使用可能な唯一のOpenCLバインディングです(MacOS X、FreeBSD、Linux、Windows、Solaris、Intel 32、64ビット、ppcバリアントを含む、ありがとう) [〜#〜] jna [〜#〜] )の使用に。
少なくともMacとWindowsでJava Web Startから実際に正常に実行されるデモがあります(Linuxでのランダムなクラッシュを避けるため、 このwikiページ を参照してください) Particles Demo 。
また、いくつかのユーティリティ(GPGPU乱数生成、基本的な並列縮約、線形代数)と Scala DSL が付属しています。
最後に、利用可能な最も古いバインディング(2009年6月以降)および アクティブなユーザーコミュニティがあります です。
(免責事項: JavaCL の著者:-))
Aparapi を考慮することもできます。コードをJavaで記述でき、実行時にバイトコードをOpenCLに変換しようとします。
完全な開示。私はAparapi開発者です。
CUDAはCの修正版です。CUDAカーネルを記述してCでコーディングし、nvidiaのCUDAコンパイラで実行可能な形式にコンパイルする必要があります。生成されたネイティブコードは、JNIを使用してJavaとリンクできます。技術的には、Javaからカーネルコードを書くことはできません。 JCUDA http://www.jcuda.de/jcuda/JCuda.html があり、一般的なメモリ/デバイス管理のためのcudaのAPIと、いくつかのJavaメソッドを提供します。 CUDAとJNIで実装(FFT、線形代数法など。)など。
一方、OpenCLは単なるAPIです。 OpenCLカーネルはAPIに渡されるプレーンな文字列なので、JavaからOpenCLを使用すると、独自のカーネルを指定できるはずです。 JavaのOpenCLバインディングは、ここにあります http://www.jocl.org/ 。
私はJOCLを使ってきましたが、とても満足しています。
(少なくとも私にとって)CUDAに対するOpenCLの主な欠点は、利用可能なライブラリ(Thrust、CUDPPなど)の欠如です。ただし、CUDAはOpenCLに簡単に移植でき、それらのライブラリの動作(アルゴリズム、戦略など)を確認することで、多くのことを学ぶことができます。
私はそれが遅れていることを知っていますが、これを見てください: https://github.com/pcpratts/rootbeer1
私はそれを使用していませんが、他のソリューションよりもはるかに使いやすいようです。
プロジェクトページから:
ルートビアは、CUDAまたはOpenCL Java言語バインディングよりも高度です。バインディングでは、開発者はオブジェクトの複雑なグラフをプリミティブ型の配列にシリアル化する必要があります。ルートビアでは、これは自動的に行われます。また、言語バインディングでは、開発者はCUDAまたはOpenCLでGPUカーネルを記述する必要があります。 Rootbeerを使用すると、Javaバイトコードの静的分析が行われ(Sootを使用)、CUDAコードが自動的に生成されます。
jogamp.orgによるJOCL をお勧めします。Linux、Mac、Windowsで動作します。 [〜#〜] conrad [〜#〜] は、たとえば、JOCLと組み合わせてOpenCLを多用します。
画像処理や幾何学演算を行いたい場合は、gpuをサポートした線形代数ライブラリが必要になる場合があります(CUDAなどを使用)。 ND4J魔女は、DeepLearning4Jが構築されているCUDA GPUサポートを備えた線形アルゴリズムです。それにより、CUDAを直接処理する必要がなく、cで低レベルのコードを作成する必要があります。さらに、DL4Jを使用して画像をさらに処理したい場合は、畳み込みなどの特定の画像処理操作にアクセスできます。
CUDA4J APIをご覧ください