Java 1.8 の新しい Stream インターフェイスを使用して疎行列演算を実装できると思いますか? はいの場合、マトリックスと操作をどのように実装する必要がありますか。明らかに、私は最終的に「自動」並列化を使用できるようにするためにそれを探しています。
1009 次
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 年間を費やしたくない場合は、事前にコード化されたものを使用することを心からお勧めします。これは非常に大きな研究/最適化のトピックであり、次のように考慮すべき多くの要因があります (私の頭の上から):
- キャッシュのパフォーマンスを向上させるためのマトリックス値のスケジューリング/再配列
- 特定の問題に最適なストレージ形式を使用する (たとえば、netlibに関するこの調査を参照)
手作りの実装と比較して、桁違いのパフォーマンスの向上を達成できる多くの実装があります。いくつか例を挙げると、以下をチェックしてください。
la4jのようなものは非常に有望に見えますが、それらがまだ存在しない場合は、それらへのバインディングを書くだけです。
于 2014-10-18T17:24:15.333 に答える