Java で OpenCL をサポートするには、どの API を使用すればよいですか。
パフォーマンスに最適な方法を知りたい
- JavaCL
- アパラピ(AMD提供のAPI)
- JOCL
Java バイト コードを OpenCL に変換するには JavaCL が必要ですか、それとも Aparapi (AMD が提供する API) だけで実行できますか。
私の知る限り、バイトコードから OpenCL への自動変換を提供するフレームワークは Aparapi だけです。RootBeer は、CUDA に対して同様のオプションを提供しています。
OpenCL を手動で調整する準備ができている場合、および/または OpenCL のいくつかのより高度な機能 (ローカルメモリ、ベクトル命令、転送/ディスパッチのオーバーラップ) を利用する方法を知っている場合、JavaCL または JOCL がより多くのパフォーマンスの機会を提供することがわかる WRT パフォーマンス。
具体的には、適用したい複数の OpenCL カーネルがある場合 (パイプラインなど)、JOCL/JavaCL を使用して、ホストと GPU 間のバッファー転送をより簡単に最小化できます。ここで Aparapi にはある程度の柔軟性がありません。
ただし、ほとんどの「単純な」アルゴリズムのパフォーマンスは、これら 3 つのフレームワーク間で非常に似ていると予想します (そして観察しました)。
私の提案 (私が Aparapi の発明者/初期貢献者である完全な開示) は、生成された OpenCL を「微調整」したい場合 (Aparapi を使用すると、生成されたコードをリストすることができます)、または実験したいことがわかった場合に、Aparapi を試すことです。重複するバッファ/転送またはマルチ カーネル ディスパッチを使用すると、経験を積んだらいつでも JOCL/JavaCL に切り替えることができます。