- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对外部分配的数据执行大量计算,尤其是矩阵乘法。可以通过Eigen::Map
来完成。不幸的是,我不是矢量化计算方面的专家,但据我所知,可以指定 Aligned
Map
的标志。
我决定通过 Eigen::MatrixXf
检查矩阵乘法之间的性能差异和 'Eigen::Map':
void testMatProduct(
const Eigen::MatrixXf &a,
const Eigen::MatrixXf &b,
Eigen::MatrixXf &res)
{
const auto startTime = std::chrono::high_resolution_clock::now();
res.noalias() = a * b;
const auto endTime = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>( endTime - startTime ).count();
std::cout << "Mat product elapsed " << duration / 1.0e6 << std::endl;
}
using EigenMap = Eigen::Map<Eigen::MatrixXf, Eigen::Unaligned>;
void testMapProduct(
const EigenMap &a,
const EigenMap &b,
EigenMap &res)
{
const auto startTime = std::chrono::high_resolution_clock::now();
res.noalias() = a * b;
const auto endTime = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>( endTime - startTime ).count();
std::cout << "Map product elapsed " << duration / 1.0e6 << std::endl;
}
int main(int, char **)
{
srand(42);
const int64_t N = 7000;
const int64_t K = 6000;
const int64_t M = 100;
Eigen::MatrixXf mat1 = Eigen::MatrixXf::Random(N, K);
Eigen::MatrixXf mat2 = Eigen::MatrixXf::Random(K, M);
Eigen::MatrixXf matRes = Eigen::MatrixXf::Zero(N, M);
// Copy data from mats to vecs
Eigen::VectorXf vec1 = Eigen::Map<Eigen::MatrixXf>(mat1.data(), mat1.rows() * mat1.cols(), 1);
Eigen::VectorXf vec2 = Eigen::Map<Eigen::MatrixXf>(mat2.data(), mat2.rows() * mat2.cols(), 1);
Eigen::VectorXf vecRes = Eigen::VectorXf::Zero(N * M);
EigenMap map1 = EigenMap(vec1.data(), mat1.rows(), mat1.cols());
EigenMap map2 = EigenMap(vec2.data(), mat2.rows(), mat2.cols());
EigenMap mapRes = EigenMap(vecRes.data(), matRes.rows(), matRes.cols());
for(int i = 0; i < 10; ++i){
testMapProduct(map1, map2, mapRes);
testMatProduct(mat1, mat2, matRes);
matRes.setZero();
vecRes.setZero();
}
return 0;
}
我很确定这不是一个有效的基准,但它应该给我一些直觉。我用 -march=native
编译它它打印以下输出:
Map product elapsed 0.102751
Mat product elapsed 0.10224
Map product elapsed 0.10022
Mat product elapsed 0.100726
Map product elapsed 0.09963
Mat product elapsed 0.100697
Map product elapsed 0.099673
Mat product elapsed 0.100809
Map product elapsed 0.100195
.......
所以在我看来, map 乘积和矩阵乘积之间没有太大区别。
我的问题是:1)Map<MatrixXf, Unaligned>
有什么区别和Map<MatrixXf, Aligned>
在性能方面?我应该关心Map
其他操作的对齐,例如点积、元素加法等
2)我的比较正确吗?
PS抱歉我的英语不好
最佳答案
1) 数据对齐指定数据应该如何访问和排列的方式。这意味着如果您使用 Eigen::MatrixXf
,它指的是编译时维度未知、数据类型为 float
的矩阵。 ,数据指针应在 4 字节(32 位) 边界上对齐(假设 float 在系统上使用 32 位表示)。
不同的数据对齐规范对性能有什么影响?为了回答这个问题,我们将看一下以下讨论:
Talk: On a 32-bit architecture, would a 16-bit value not aligned on a 32-bit boundary be accessed more slowly?
有人可能会说,C/C++ 等语言支持子字访问,这意味着您不必转换它们,这意味着您可以节省内存空间并且不会对性能产生负面影响.
我假设 Eigen 库会自动检测 Eigen::MatrixXf
的数据指针在 4 字节边界上对齐,因此如果省略 MapOption
不会对性能产生影响。模板或将其分配给Eigen::Unaligned
。如果您想确定使用 Eigen::Aligned4
(回想一下 Eigen::Aligned
已被弃用,并且是 Aligned16
的同义词,因此为 128 位)。您可以查看对齐枚举器 here .
2) Eigen::Map
与 Eigen::Matrix
不同,矩阵和 vector 可以在不复制数据的情况下进行初始化。和Eigen::Vector
。我很确定Eigen::Map
和Eigen::Matrix
对下面的对象使用相同的乘法、加法等操作,只是引用不同。我从使用 Eigen::Matrix
中看到的唯一性能优势就缓存性能而言,是空间局部性,如果 Eigen::Map
引用内存中相距很远的两个矩阵/vector ,并且在处理巨大的矩阵大小时。当然假设您初始化了两个 Eigen::Matrix
对象紧挨着一个,这样它们在内存中是连续的。
关于c++ - Eigen:我应该使用对齐 map 进行密集计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454660/
我想了解表达式模板如何在 Eigen 中工作。 我知道两个动态双向量的总和是由如下所示的东西执行的: CwiseBinaryOp, VectorXd const, VectorXd const > o
在本征中,我们可以创建一个矩阵 Matrix3f m; m m(3, 8, 6); // Input after construction m.diagonal() << 3, 8, 6; Diag
我想知道是否有比使用 for 循环更简单的方法来解决我的问题。所以情况是这样的: 一般来说,我想从我的传感器收集数据点(消息类型为 Eigen::Vector3d,我无法更改它,因为它是一个巨大的框架
简而言之,问题是如何通过一个 Eigen::Map 反对一个期待一个函数 Eigen::MatrixXd 对象。 长话短说: 我有这个 C++ 函数声明 void npMatrix(const Eig
考虑以下代码。 const int N = 100; const float alpha = 0.9; Eigen::MatrixXf myVec = Eigen::MatrixXf::Random(
我试图获得两个张量的矩阵乘积,其中一个张量应该在相乘之前转置( At*B )。 到目前为止,我在 eigen documentation 中发现了什么是没有任何转置和两个矩阵都转置的矩阵乘积。 我正在
我的问题很简单,希望也有一个很好的答案:当我构造了 Eigen::MatrixXd 矩阵时,我可以使用多个线程同时填充矩阵中的行吗(如果我可以确保没有行被同时写入),或者我必须在每个线程中创建临时行对
#include #include namespace Eigen { // float op double -> double template struct ScalarBinaryOpTr
我在 Eigen 库的 API 上遇到了一些困难,即用于稀疏矩阵 Cholesky 分解的 SimplicialLLT 类。我需要分解三个矩阵,然后用它们来求解许多方程组(仅更改右侧) - 因此我只想
我正在尝试使用 Eigen 的 JacobiSVD 进行实验。特别是我试图从奇异值分解中重建输入矩阵。 http://eigen.tuxfamily.org/dox/classEigen_1_1Jac
我刚刚阅读了 Structures having static members Eigen 页。后者陈述如下: If you define a structure having members of
我正在使用 C++ 中的 Eigen 库来获取浮点方阵的平方根: MatrixXf gPrime(QUAD_EKF_NUM_STATES, QUAD_EKF_NUM_STATES); gPri
我正在尝试使用 vector 中的相应值来缩放矩阵中的所有列。如果此值为 0,我想用另一个按常数缩放的矩阵中的列替换该列。听起来很复杂,但在 Matlab 中它非常简单(但可能没有完全优化): a(:
使用 Eigen 将仿射变换转换为等距变换(即仅由旋转和平移组成)的最简单方法是什么? 图书馆? 两种变换都是 3D 的。仿射矩阵在左上象限有一个通用的 3x3 矩阵(即旋转、缩放和剪切),而等轴测在
我正在尝试生成 PCL 点云。我所有的点都在以下容器类型中: std::vector > 我想创建一个指向 PCL 点云的指针: pcl::PointCloud::Ptr pc 创建此点云的最有效方法
最近,我编译了 Eigen3 并用它在 Windows 上做一些线性代数任务。 但我想知道为什么 Eigen3 不需要链接额外的 lib 或 DLL(我只需要包含它的头文件) Eigen 是否在编译时
我正在使用特征张量库,在我看来,shuffle() 方法需要一个对象 Eigen::array 作为输入。 在我的实现中,我有一个 std::list 需要传递给 shuffle (当然我只在运行时知
我有两个问题。 Eigen::Affine3f 和 Eigen::Matrix4f 中表示的刚性变换是否相同? 我们如何从 Eigen::Affine3f 转换为 Eigen::Matrix4f,反之
我想用单个 3-D Eigen::Tensor 替换代码中的一系列矩阵。考虑到这一点,我尝试比较张量和矩阵的性能。 下面的函数“tensorContractTest”执行 (n,n,n) 3 阶张量与
如何将 ArrayXXd 数组转换为 MatrixXd?到目前为止,我已经完成了 MatrixXd temp_mat = my_array; 并且隐式转换似乎工作正常,但这是应该完成的方式吗?或者我应
我是一名优秀的程序员,十分优秀!