gpt4 book ai didi

c++ - 使用 Eigen 和 C++ 做大量矩阵乘积的列和

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:01 28 4
gpt4 key购买 nike

我正在尝试计算 colsum(N * P),其中 N 是稀疏的 1M x 2500 矩阵,P 是密集的 2500 x 1.5M 矩阵。我将 Eigen C++ 库与英特尔的 MKL 库一起使用。问题是矩阵 N*P 实际上不能存在于内存中,它太大了(~10 TB)。我的问题是 Eigen 是否能够通过惰性评估和并行性的某种组合来处理这个计算?它在这里说 Eigen 不会不必要地制作临时矩阵:http://eigen.tuxfamily.org/dox-devel/TopicLazyEvaluation.html

但是 Eigen 是否知道在实际适合内存的分段 block 中计算 N * P? IE:它必须做类似 colsum(N * P_1)++ colsum(N * P_2)++ ..++ colsum(N * P_n) 的事情,其中​​ P 按列拆分为 n 个不同的子矩阵,“+ +"是串联。

我正在使用 128 GB RAM。

最佳答案

我尝试了一下,但最终遇到了错误的 malloc(我在 Win8 上仅在 8GB 上运行)。我设置了我的 main() 并使用了我编写的非内联 colsum 函数。

int main(int argc, char *argv[])
{
Eigen::MatrixXd dense = Eigen::MatrixXd::Random(1000, 100000);
Eigen::SparseMatrix<double> sparse(100000, 1000);
typedef Triplet<int> Trip;
std::vector<Trip> trps(dense.rows());
for(int i = 0; i < dense.rows(); i++)
{
trps[i] = Trip(20*i, i, 2);
}
sparse.setFromTriplets(trps.begin(), trps.end());

VectorXd res = colsum(sparse, dense);
std::cout << res;
std::cin >> argc;
return 0;
}

尝试很简单:

__declspec(noinline) VectorXd 
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
return (sparse * dense).colwise().sum();
}

那有一个糟糕的 malloc。看来你必须自己手动拆分它(除非其他人有更好的解决方案)。

编辑

我稍微改进了功能,但得到了同样糟糕的 malloc:

__declspec(noinline) VectorXd 
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
return (sparse * dense).topRows(4).colwise().sum();
}

编辑2

另一种选择是使稀疏矩阵变稠密并强制进行惰性求值。我认为它不适用于稀疏矩阵(好吧)。

__declspec(noinline) VectorXd 
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
Eigen::MatrixXd denseSparse(sparse);
return denseSparse.lazyProduct(dense).colwise().sum();
}

这并没有给我糟糕的 malloc,而是计算了很多毫无意义的 0*x_i 表达式。

关于c++ - 使用 Eigen 和 C++ 做大量矩阵乘积的列和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674157/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com