分解大量小矩阵时,本征partial_lu_inplace的瓶颈

时间:2018-11-14 10:48:17

标签: eigen

我需要分解最大变量大小为20x20的〜1e05个小矩阵。使用HpcToolkit对矩阵分解进行的分析表明,代码中的热点位于protobuf::error_message_t::packet_type中。

我检查了Eigen documenation on the inplace matrix decomposition,并且我了解对于大型矩阵使用就地分解,重新使用内存并提高缓存效率非常重要。

我目前正在按如下方式计算分解:

Eigen::internal::partial_lu_inplace

使用HpcToolkit进行分析表明,就地分解是热点:

enter image description here

是否可以禁用就地分解并测试代码对我正在处理的小型矩阵是否更快?

注意:如果您在图像的列中查看CPU时间,您会注意到运行时间以秒为单位:在这里我不是经过微秒级优化的,所以计算总共需要大约4秒钟。

编辑:HPCToolkit在完全优化的模式下统计代码 // Factorize the matrix. matrixFactorization_ = A_.partialPivLu(); ,但具有将测量结果映射到源代码{{ 1}}。

1 个答案:

答案 0 :(得分:4)

如果探查器为您提供了如此详细的信息,则您忘记启用编译器的优化功能(例如-O3 -march = native -DNDEBUG或“发布”模式+ / arch:AVX与VS)。有了Eigen,这将带来巨大的改变。

然后,您可以使用以下方法保存动态内存分配:

var country = document.getElementById("famous_person_country");
var state = document.getElementById("famous_person_state");

矩阵typedef Matrix<double,Dynamic,Dynamic,ColMajor,20,20> MatMax20; MatMax20 A_; PartialPivLU<MatMax20> matrixFactorization_; A_的所有内部元素将因此被静态分配。

要更新现有的事实,最好编写:

PartialPivLU