c++ - Eigen 运算符在内部如何解释为 MKL 函数?

标签 c++ memory eigen eigen3 intel-mkl

Eigen是一个非常方便的库,可以用简洁且人类直观的方式表达数学公式。我知道 Eigen 有惰性求值概念,可以表示表达式类中的一系列操作,并在必要时有效地求值。我还知道 Eigen 可以与 MKL 一起使用。但是,我很好奇什么样的表达式可以转移到 MKL cblas 调用中。什么情况下不能转让?有什么一般规则可以帮助我弄清楚什么是可转让的吗?

通常,我对以下情况感到好奇:

MatrixXd A, B, C;
VectorXd a, b, c;
double w1, w2, w3;

b += w1 * A * a;  // can be done through dgemv
b += w1 * A.transpose() * a;  // can be done through dgemv
C += w2 * A * B;  // can be done through dgemm
C += w2 * A.transpose() * B;  // can be done through dgemm
C += w2 * A. topRows(5).transpose() * B;  // can be done through dgemm

D = A * B * C;    // cannot be done in one func call through cblas

注意:注释不是特征转移结果。相反,这是理想的结果。我不确定 Eigen 是否可以转移它们。

还有另一个问题:Eigen 什么时候会在这些操作链中分配临时内存?是否有任何一般规则可以帮助我确定是否发生了任何分配?

最佳答案

要完成 chtz 答案,您的所有假设都是正确的(前提是您添加 .noalias() 装饰器),更一般地,任何看起来像 gemv/gemm 的表达式或子表达式都将变成单个调用,包括转置、 block 、共轭等。您可以在 unit test 中查找示例计算临时的数量,因此 0 表示单个 blas-like 调用,1 表示将在 blas-like 调用之前或之后创建一个临时,等等

关于c++ - Eigen 运算符在内部如何解释为 MKL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50808601/

相关文章:

python - Pygraphviz 安装失败,错误代码为 1083 无法打开文件 graphviz/cgraph.h : No such file or directory

c++ - 实现高斯模糊 - 如何计算卷积矩阵(内核)

c++ - C++结构中的回调

java - java堆分配多少物理内存是怎么决定的?

c# - 获取以兆字节为单位的物理内存使用情况

eigen - 来自 Eigen 的 2000 行警告

c++ - 从文件 C++ 获取输入(矩阵数组输入)

android - 位图大小超出 VM 预算,不明白为什么

c++ - Eigen::Vector3f 对齐

c++ - Eigen:将实数和虚数 MatrixXd 映射到 MatrixXcd