Eigen具有惊人的快速GEMM实现,所以我想在我的pet项目张量库中使用它。
如果我理解正确,可以通过eigen::map。我写了一个简单的例子
EIGEN_NO_MALLOC
以确保没有不需要的分配。
它很适合简单的矩阵乘法
C += A * B
是的。
但不幸的是它不能处理
C += alpha * A * B
(gemm-like)情况。
#include <iostream>
#include <vector>
#define EIGEN_NO_MALLOC
#include "Eigen/Core"
int main()
{
using Scalar = float;
using namespace Eigen;
std::vector<Scalar> aDat = {1, 2, 3, 4};
std::vector<Scalar> bDat = {1, 2, 3, 4};
std::vector<Scalar> cDat = {1, 2, 3, 4};
Map<Matrix<Scalar, -1, -1, RowMajor>, Unaligned> a(aDat.data(), 2, 2);
Map<Matrix<Scalar, -1, -1, RowMajor>, Unaligned> b(bDat.data(), 2, 2);
Map<Matrix<Scalar, -1, -1, RowMajor>, Unaligned> c(cDat.data(), 2, 2);
//Ok
c.noalias() += a * b;
//Assertion `false && "heap allocation is forbidden.....
c.noalias() += 2 * a * b;
return 0;
}
c.noalias() += 2 * a * b;
给出以下运行时错误
a.out: path_to_eigen/Eigen/src/Core/util/Memory.h:129: void Eigen::internal::check_that_malloc_is_allowed(): Assertion `false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)"' failed.
可以打电话吗
c.noalias() += someScalar * a * b;
没有分配?
PS我的特征版本是
3.3.2
,请
gcc
版本是
7.2.0
对不起我英语不好