4

Java 1.8 の新しい Stream インターフェイスを使用して疎行列演算を実装できると思いますか? はいの場合、マトリックスと操作をどのように実装する必要がありますか。明らかに、私は最終的に「自動」並列化を使用できるようにするためにそれを探しています。

4

1 に答える 1

2

それは明らかにできる。単純な SPMV (スパース行列ベクトルの乗算) の場合、次のようなものはどうでしょうか。スパース行列は座標COO形式 (最も単純なスパース形式)で表されます。

class COO {
    int x, y, value;
}

public static ArrayList<Integer> spmv(List<COO> values, ArrayList<Integer> v) {
    final ArrayList<Integer> result = new ArrayList<>(Collections.nCopies(v.size(), 0));
    values.stream().forEach(
            coo -> result.set(coo.x, result.get(coo.x) + coo.value * v.get(coo.y))
    );
    return result;
}

しかし、疎行列演算のパフォーマンスへの影響を理解するために今後 3 年間を費やしたくない場合は、事前にコード化されたものを使用することを心からお勧めします。これは非常に大きな研究/最適化のトピックであり、次のように考慮すべき多くの要因があります (私の頭の上から):

  1. キャッシュのパフォーマンスを向上させるためのマトリックス値のスケジューリング/再配列
  2. 特定の問題に最適なストレージ形式を使用する (たとえば、netlibに関するこの調査を参照)

手作りの実装と比較して、桁違いのパフォーマンスの向上を達成できる多くの実装があります。いくつか例を挙げると、以下をチェックしてください。

  1. インテル® MKL スパース BLAS

  2. Nvidia の cuBLAS

la4jのようなものは非常に有望に見えますが、それらがまだ存在しない場合は、それらへのバインディングを書くだけです。

于 2014-10-18T17:24:15.333 に答える