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/