具有特征的高效块稀疏矩阵乘法
Efficient block-sparse matrix multiplication with Eigen
假设我有一个矩阵,它是稀疏的,除了沿对角线的块(固定大小)。
Eigen::SparseMatrix<float> lhs;
lhs约为2%非稀疏,但可能非常大。然后,假设有一个向量:
Eigen::MatrixXf rhs = Eigen::MatrixXf::Random(SomeSz, 1);
现在,我们假设它是稠密的
我想高效地计算:
result.noalias() = lhs * rhs;
如果我使用-O3 -march=native -mtune=native(使用Clang)进行编译,这会产生最佳结果吗?
如果rhs是稀疏的呢:
Eigen::SparseMatrix<float> rhs; rhs.resize(SomeSz, 1); rhs.reserve(SomeSz/SomeFactor);
:
result = lhs * rhs;
仍然最优/不佳?
我想我要问的是,Eigen是否会利用块稀疏结构,只执行必要的计算。
首先,在rhs的密集情况下,如果rhs是一个向量,那么请使用VectorXf
告诉Eigen。然后,在Eigen 3.3中,您可以通过使用-fopenmp
编译并使用lhs
的行为主存储来利用多线程。
在稀疏情况下,yes Eigen将同时考虑lhs和rhs的稀疏性。与具有密集rhs的rhs.size()*average_nnz_per_col_of_lhs
相比,复杂性实际上是rhs.nonZeros()*average_nnz_per_col_of_lhs
。如果rhs真的很稀疏,那么值得一试。只考虑lhs中有用的一列。在这种情况下,最好保持lhs列为主。
- C++中高效的大型稀疏块压缩线性方程
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 如何在C++中高效地构造随机骰子
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- 特征:模板函数中矩阵的平面图
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 特征 c++:复矩阵的面积双曲正切(atanh)
- 如何实现高效的算法来计算大型数据集的多个不同值?
- C++ 中的特征向量计算
- 根据C++标准的定义实现"is_similar"类型特征
- C++中特征对角矩阵类型的高效存储
- C++ 包含特征矩阵的类的高效算术运算符重载
- 来自函数的高效特征矩阵
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 具有特征的高效块稀疏矩阵乘法