JavaのGPGPU / CUDA / OpenCLに最適なアプローチは?


94

グラフィックスプロセッシングユニットでの汎用コンピューティング(GPGPU)でのは、あらゆる種類のコンピューティングにGPUの能力を活用するための非常に魅力的なコンセプトです。

画像処理、パーティクル、高速な幾何演算にGPGPUを使用したいです。

現在、この分野の2つの候補はCUDAとOpenCLのようです。知りたい:

  • OpenCLはWindows / MacのJavaからまだ使用できますか?
  • OpenCL / CUDAにインターフェースするライブラリーの方法は何ですか?
  • JNAを直接使用することはオプションですか?
  • 何か忘れてる?

実世界での経験、例、戦争の話は大歓迎です。


1
cudaプログラミングでポインタをどれだけ使用するかを考えると、JavaでのGPUのプログラミングは難しいと思います。JavaをC ++と区別する完全なJava機能/ライブラリが実装されている可能性は低いので、デバイスプログラミングでJavaを使用することには大きなメリットがあるかどうかはわかりません
Anycorn

2
GLSLとおそらくCUDAを使用した印象的なJavaデモをいくつか見たので、それは確かに可能です。
フレデリク

1
jcuda.orgとjocl.orgを確認しましたか?
bakkal

1
私はそれらについて知っていますが、品質を判断することはできません。それらの経験はありますか?
フレデリク

4
@Nils:だから、彼がGPUですべての数値処理をプッシュしたいのはそのためです...とにかく、プレーンなCまたはx86 asmでさえ、GPUのような大規模なデータ並列プロセッサと競合するのは難しいでしょう。
ストリンガー2010

回答:


62

AFAIK、JavaCL / OpenCL4Javaは、JNAの使用により、現在すべてのプラットフォーム(MacOS X、FreeBSD、Linux、Windows、Solaris、すべてIntel 32、64ビット、ppcバリアントを含む)で利用できる唯一のOpenCLバインディングです。)。

少なくともMacとWindowsで実際にJava Web Startから正常に実行されるデモがあります(Linuxでのランダムクラッシュを回避するために、このパーティクルデモなどのこのWikiページを参照してください

また、いくつかのユーティリティ(GPGPU乱数生成、基本的な並列縮小、線形代数)とScala DSLも付属しています

最後に、これは利用可能な最も古いバインディングであり(2009年6月以降)、アクティブなユーザーコミュニティがあります。ます。

(免責事項:私はJavaCLの作者です:-))


ああ、私はJNLPにとても興奮していましたが、どうやら私のMacbookは好きではありません。クロスプラットフォームについてはこれで終わりです。
Karl

5
@カール申し訳ありませんが、JNLP(JARは最近変更された名前)を破りました!これは修正されました。もう一度試してみてください(そしてクロスプラットフォーム的には、すべてのプラットフォームで一貫して壊れていました
;

3
最近のJava 7のセキュリティ強化により、Particle Demo Web Startは例外で失敗します。
するThorbjörnRavnアンデルセン

@zOlive Googleコードへの最後のJavaClリンクはもう利用できません。
tryman

34

Aparapiを検討することもできます。これにより、Javaでコードを記述でき、実行時にバイトコードをOpenCLに変換しようとします。

完全な開示。私はアパラピ開発者です。


アパラピはまだ維持されていますか?
ジェダイ氏

@MrJedi:そう思う、githubの最新のコミットはほんの数日前のものです:github.com/aparapi/aparapi
Aydin K.

「ある程度メンテナンスされている」;)私はメンテナーです。
barneypitt 2017年

12

まあCUDAはCの修正版です。CUDAカーネルを記述してCでコーディングし、nvidiaのCUDAコンパイラで実行可能な形式にコンパイルする必要があります。生成されたネイティブコードは、JNIを使​​用してJavaとリンクできます。したがって、技術的には、Javaからカーネルコードを作成することはできません。JCUDA http://www.jcuda.de/jcuda/JCuda.htmlがあります、一般的なメモリ/デバイス管理のためのcudaのAPIと、CUDAおよびJNIラップで実装されたいくつかのJavaメソッド(FFT、いくつかの線形代数メソッド)を提供します..などなど)。

一方、OpenCLは単なるAPIです。OpenCLカーネルはAPIに渡されるプレーンな文字列なので、JavaのOpenCLを使用すると、独自のカーネルを指定できるはずです。JavaのOpenCLバインディングは、http://www.jocl.org/にあります


2
JNA(jna.dev.java.net)がプラットフォームでサポートされている場合、JNIライブラリをコーディングするよりもはるかに手間がかからないので、それを使用してネイティブコードを呼び出します。
mdma

11

私はJOCLを使用してきましたが、とても満足しています。

CUDA(少なくとも私にとって)に対するOpenCLの主な欠点は、使用可能なライブラリ(Thrust、CUDPPなど)がないことです。ただし、CUDAはOpenCLに簡単に移植できます。また、CUDAは多くのことを学ぶので、これらのライブラリの機能(アルゴリズム、戦略など)を確認することは非常に便利です。


7

私はそれが遅いことを知っていますが、これを見てくださいhttps : //github.com/pcpratts/rootbeer1

私はそれで働いていませんが、他のソリューションよりもはるかに使いやすいようです。

プロジェクトページから:

Rootbeerは、CUDAまたはOpenCL Java言語バインディングよりも高度です。バインディングでは、開発者はオブジェクトの複雑なグラフをプリミティブ型の配列にシリアル化する必要があります。Rootbeerでは、これは自動的に行われます。また、言語バインディングの場合、開発者はGPUカーネルをCUDAまたはOpenCLで記述する必要があります。Rootbeerを使用すると、Javaバイトコードの静的分析が実行され(Sootを使用)、CUDAコードが自動的に生成されます。



1

いくつかの画像処理または幾何演算を実行する場合は、gpuサポートを備えた線形代数ライブラリ(たとえば、CUDAを使用)が必要になる場合があります。ND4J witchは、DeepLearning4Jが構築されているCUDA GPUサポートを備えた線形代数であることをお勧めします。これにより、CUDAを直接処理する必要がなく、cで低レベルのコードを実行する必要があります。さらに、DL4Jを使用して画像をさらに処理したい場合は、畳み込みなどの特定の画像処理操作にアクセスできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.