Java で高価なベクトル演算を計算する方法を研究しています。たとえば、内積や大きな行列間の乗算などです。このトピックについては、 thisやthisなどの良いスレッドがいくつかあります。
JIT コンパイル コードで CPU ベクトル命令 (SSE2、AVX、MMX...) を使用する信頼できる方法はないようです。さらに、高性能線形代数ライブラリ (ND4J、jblas など) は、コア ルーチンの BLAS/LAPACK ライブラリへの JNI 呼び出しを実際に行います。また、BLAS/LAPACK パッケージがネイティブ線形代数計算のデファクトスタンダードの選択肢であることも理解しています。
一方、他のもの (JAMA など) は、native
呼び出しなしで純粋な Java でアルゴリズムを実装します。
私の質問は次のとおりです。
- ここでのベストプラクティスは何ですか?
native
BLAS/LAPACK の呼び出しは実際に推奨される選択ですか? 検討する価値のある他のライブラリはありますか?- パフォーマンスの向上に比べて、JNI 呼び出しのオーバーヘッドは無視できますか? しきい値がどこにあるかについて経験のある人はいますか (たとえば、純粋な Java ルーチンよりも高価な JNI 呼び出しを行うには、入力をどれくらい小さくする必要がありますか?)
- 移植性のトレードオフはどの程度ですか?
この質問が、独自の計算ルーチンを開発する人にも、さまざまな実装から知識に基づいた選択をしたいだけの人にも役立つことを願っています。
洞察は大歓迎です!