6

Java で高価なベクトル演算を計算する方法を研究しています。たとえば、内積や大きな行列間の乗算などです。このトピックについては、 thisthisなどの良いスレッドがいくつかあります。

JIT コンパイル コードで CPU ベクトル命令 (SSE2、AVX、MMX...) を使用する信頼できる方法はないようです。さらに、高性能線形代数ライブラリ (ND4J、jblas など) は、コア ルーチンの BLAS/LAPACK ライブラリへの JNI 呼び出しを実際に行います。また、BLAS/LAPACK パッケージがネイティブ線形代数計算のデファクトスタンダードの選択肢であることも理解しています。
一方、他のもの (JAMA など) は、native呼び出しなしで純粋な Java でアルゴリズムを実装します。

私の質問は次のとおりです。

  • ここでのベストプラクティスは何ですか?
  • nativeBLAS/LAPACK の呼び出しは実際に推奨される選択ですか? 検討する価値のある他のライブラリはありますか?
  • パフォーマンスの向上に比べて、JNI 呼び出しのオーバーヘッドは無視できますか? しきい値がどこにあるかについて経験のある人はいますか (たとえば、純粋な Java ルーチンよりも高価な JNI 呼び出しを行うには、入力をどれくらい小さくする必要がありますか?)
  • 移植性のトレードオフはどの程度ですか?



この質問が、独自の計算ルーチンを開発する人にも、さまざまな実装から知識に基づいた選択をしたいだけの人にも役立つことを願っています。

洞察は大歓迎です!

4

1 に答える 1

5

すべてのケースに明確なベスト プラクティスはありません。純粋な Java ソリューション (SIMD 命令を使用しない) または (SIMD で最適化された) ネイティブ コードを JNI 経由で使用できるかどうかは、特定のアプリケーション、特に配列のサイズとターゲット システムで考えられる制限によって異なります。

  1. ターゲット システムに特定のネイティブ ライブラリをインストールすることを許可されておらず、BLAS がまだインストールされていないという要件がある場合があります。その場合、Java ライブラリを使用するだけです。
  2. 純粋な Java ライブラリは、長さが 100 よりもはるかに小さい配列に対してパフォーマンスが向上する傾向があり、その後のある時点で、JNI を介してネイティブ ライブラリを使用するとパフォーマンスが向上します。いつものように、走行距離は異なる場合があります。

関連するベンチマークが実行されました (順不同):

これらのベンチマークは有益であるため、混乱を招く可能性があります。あるライブラリは、一部の操作では高速で、別の操作では低速になる場合があります。また、システムで利用可能な BLAS の実装が複数ある場合があることにも注意してください。現在、システム blas、atlas、openblas に 3 つインストールしています。BLAS 実装をラップする Java ライブラリを選択する以外に、基礎となる BLAS 実装も選択する必要があります。

この回答には、かなり新しいnd4jについて言及していないことを除いて、かなり最新のリストがあります。jeigen は固有値に依存するため、BLAS には依存しないことに注意してください。

于 2016-12-27T17:48:53.627 に答える