2016-09-25 144 views
0

假設我有一個稀疏矩陣,除了沿着對角線(固定大小)的塊。使用特徵的高效塊稀疏矩陣乘法

Eigen::SparseMatrix<float> lhs;

LHS是大約2%的非稀疏,也可以是非常大的。那麼,讓我們說我有一個向量:

Eigen::MatrixXf rhs = Eigen::MatrixXf::Random(SomeSz, 1);

就目前而言,我們假設它是密集。

我想有效地計算:

result.noalias() = lhs * rhs;

如果我是-O3 -march =本地-mtune =原生(鏗鏘)進行編譯,這會產生最佳的結果呢?

而且,如果什麼RHS稀疏:

Eigen::SparseMatrix<float> rhs; rhs.resize(SomeSz, 1); rhs.reserve(SomeSz/SomeFactor);

是:

result = lhs * rhs;

仍然最優/次優?

我想我要問的是Eigen是否會利用塊稀疏結構,只執行必要的計算。

回答

0

首先,在rhs密集的情況下,如果rhs是矢量,那麼請通過使用VectorXf將它告訴Eigen。然後,通過Eigen 3.3,您可以利用多線程編譯-fopenmp並使用lhs的行主存儲。

在稀疏的情況下,是Eigen會考慮lhs和rhs的稀疏性。複雜性將確實是rhs.nonZeros()*average_nnz_per_col_of_lhs,相比之下rhs.size()*average_nnz_per_col_of_lhs與密集的rhs。所以如果rhs真的很稀疏,那麼可能值得一試。只考慮lhs的有用列。在這種情況下,最好保留lhs專欄。