大矩阵乘法核心转储

Posted

技术标签:

【中文标题】大矩阵乘法核心转储【英文标题】:big matrix multiplication core dump 【发布时间】:2014-01-14 13:36:27 【问题描述】:

以下程序正在捕获。

void main()  
 fmat A,W,H;  
 W.load("w.csv"); //W is of size 150000x100  
 H.load("h.csv"); //H is of size 300000x100 
 A.set_size(W.n_rows,H.n_rows);  
 A.zeros();  
 A=W*H.t();  
  

上面的程序是使用带有 fopenmp 标志的 g++ 4.8 编译的,并在 ubuntu 64 位和 384GB 内存上运行。我正在使用openblas。 W 和 H 是任意随机正矩阵。

上面的代码在乘法过程中捕获并创建核心转储。代码在 A.zeros() 之前是成功的。我检查了ulimit,它显示无限。我还尝试将 A 创建为 W 和 H 向量的外积之和。它也是陷阱。此外,当 W 和 H 为 SMALL 时,代码正在工作并且不会陷入陷阱。

如何将两个大矩阵相乘?有大小限制吗?

【问题讨论】:

您得到的确切错误信息是什么? 分段错误(核心转储) 首先尝试使用普通的 Blas,以确保问题不在 OpenBlas 中。此外,您可能需要编辑 include/armadillo_bits/config.hpp 并启用 ARMA_64BIT_WORD 【参考方案1】:

@mtall 在上述评论中的回答就是答案。在 include/armadillo_bits/config.hpp 中启用 ARMA_64BIT_WORD。包含目录可以在您安装犰狳的地方找到。例如,在我的情况下,它位于 /usr/local 中。

【讨论】:

以上是关于大矩阵乘法核心转储的主要内容,如果未能解决你的问题,请参考以下文章

基于MapReduce的并行化大矩阵乘法

C++ 乘法大矩阵

Spark中的矩阵乘法分析

稀疏矩阵 - 矩阵乘法

MPI矩阵乘法

Spark中的矩阵乘法源码分析