gpt4 book ai didi

c++ - 对于单精度矩阵运算,AVX 与 SSE 的 Eigen 性能没有差异?

转载 作者:太空狗 更新时间:2023-10-29 20:35:00 31 4
gpt4 key购买 nike

在我的项目中,我使用 Eigen3.3 库对 6x6 矩阵进行计算。我决定调查 AVX 指令是否真的给我带来了超过 SSE 的任何加速。我的 CPU 确实支持这两种设置:

model name      : Intel(R) Xeon(R) CPU E5-1607 v2 @ 3.00GHz
flags : ... sse sse2 ... ssse3 ... sse4_1 sse4_2 ... avx ...

因此,我使用两组不同的标志使用 gcc4.8 编译了一个小测试,如下所示:

$ g++ test-eigen.cxx -o test-eigen -march=native -O2 -mavx
$ g++ test-eigen.cxx -o test-eigen -march=native -O2 -mno-avx

我确认第二种情况 -mno-avx 没有产生任何带有 ymm 寄存器的指令。尽管如此,这两种情况给我的结果非常相似,用 perf 测量大约 520 毫秒。

这里是程序 test-eigen.cxx(它对两个矩阵的总和求逆,只是为了接近我正在处理的实际任务):

#define NDEBUG

#include <iostream>
#include "Eigen/Dense"

using namespace Eigen;

int main()
{
typedef Matrix<float, 6, 6> MyMatrix_t;

MyMatrix_t A = MyMatrix_t::Random();
MyMatrix_t B = MyMatrix_t::Random();
MyMatrix_t C = MyMatrix_t::Zero();
MyMatrix_t D = MyMatrix_t::Zero();
MyMatrix_t E = MyMatrix_t::Constant(0.001);

// Make A and B symmetric positive definite matrices
A.diagonal() = A.diagonal().cwiseAbs();
A.noalias() = MyMatrix_t(A.triangularView<Lower>()) * MyMatrix_t(A.triangularView<Lower>()).transpose();

B.diagonal() = B.diagonal().cwiseAbs();
B.noalias() = MyMatrix_t(B.triangularView<Lower>()) * MyMatrix_t(B.triangularView<Lower>()).transpose();

for (int i = 0; i < 1000000; i++)
{
// Calculate C = (A + B)^-1
C = (A + B).llt().solve(MyMatrix_t::Identity());

D += C;

// Somehow modify A and B so they remain symmetric
A += B;
B += E;
}

std::cout << D << "\n";

return 0;
}

我真的应该期望 Eigen 中的 AVX 有更好的性能吗?或者我在编译器标志或 Eigen 配置中遗漏了什么?我的测试可能不适合证明差异,但我看不出它有什么问题。

最佳答案

您使用的矩阵太小而无法使用 AVX:单精度时,AVX 一次处理 8 个标量的数据包。使用 6x6 矩阵时,AVX 只能用于纯分量操作,如 A = B + C,因为它们可以被视为对大小为 36 且大于 8 的一维 vector 的操作。在对于您的情况,与 Cholesky 分解和求解的成本相比,这些类型的操作可以忽略不计。

要查看差异,请转到大小为 100x100 或更大的 MatrixXf 矩阵。

关于c++ - 对于单精度矩阵运算,AVX 与 SSE 的 Eigen 性能没有差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290599/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com