C++ eigen3 线性代数库,奇数性能结果
C++ eigen3 linear algebra library, odd performance results
我已经在 c++ 中使用 eigen3 线性代数库一段时间了,我一直试图利用矢量化性能优势。今天,我决定测试矢量化在多大程度上真正加快了我的程序速度。因此,我编写了以下测试程序:
---特征测试.cpp ---
#include <eigen3/Eigen/Dense>
using namespace Eigen;
#include <iostream>
int main() {
Matrix4d accumulator=Matrix4d::Zero();
Matrix4d randMat = Matrix4d::Random();
Matrix4d constMat = Matrix4d::Constant(2);
for(int i=0; i<1000000; i++) {
randMat+=constMat;
accumulator+=randMat*randMat;
}
std::cout<<accumulator(0,0)<<"n"; // To avoid optimizing everything away
return 0;
}
然后,我使用不同的编译器选项编译后运行了该程序:(结果不是一次性的,许多运行都会给出类似的结果(
$ g++ eigentest.cpp -o eigentest -DNDEBUG -std=c++0x -march=native
$ time ./eigentest
5.33334e+18
real 0m4.409s
user 0m4.404s
sys 0m0.000s
$ g++ eigentest.cpp -o eigentest -DNDEBUG -std=c++0x
$ time ./eigentest
5.33334e+18
real 0m4.085s
user 0m4.040s
sys 0m0.000s
$ g++ eigentest.cpp -o eigentest -DNDEBUG -std=c++0x -march=native -O3
$ time ./eigentest
5.33334e+18
real 0m0.147s
user 0m0.136s
sys 0m0.000s
$ g++ eigentest.cpp -o eigentest -DNDEBUG -std=c++0x -O3
$time ./eigentest
5.33334e+18
real 0m0.025s
user 0m0.024s
sys 0m0.000s
这是我的相关 CPU 信息:
model name : AMD Athlon(tm) 64 X2 Dual Core Processor 5600+
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dn
我知道当我不使用编译器选项时,-march=native
没有矢量化,因为当我不使用它时,我永远不会得到分割错误,或者由于矢量化而导致的错误结果,而不是我使用它的情况(-NDEBUG
(。
这些结果让我相信,至少在我的 CPU 上使用 eigen3 进行矢量化会导致执行速度变慢。我应该责怪谁?我的CPU,特征3还是gcc?
编辑:为了消除任何疑问,我现在尝试在尝试测量无矢量化情况的性能的情况下添加-DEIGEN_DONT_ALIGN
编译器选项,并且结果相同。此外,当我将-DEIGEN_DONT_ALIGN
与-march=native
一起添加时,结果变得非常接近没有-march=native
的情况。
你想象的更聪明,并且仍然优化了很多东西。
在我的平台上,我没有-march=native
我得到大约 9 毫秒,-march=native
大约 39 毫秒。但是,如果我将返回上方的行替换为
std::cout<<accumulator<<"n";
然后,在没有-march=native
的情况下,时序更改为 78 毫秒,在 -march=native
的情况下更改为大约 39 毫秒。
因此,似乎在没有矢量化的情况下,编译器意识到您只使用矩阵的 (0,0( 元素,因此它只计算该元素。但是,如果启用了矢量化,则无法执行该优化。
如果您输出整个矩阵,从而强制编译器计算所有条目,那么矢量化会按预期以因子 2 加速程序(尽管我很惊讶地看到它在我的计时中正好是因子 2(。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- valgrind-hellgrind与泄漏检查的结果不同
- OpenMP阵列性能较差
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 递归列出所有目录中的C++与Python与Ruby的性能
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 大小相等但成员数量不同的结构之间的性能差异
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 为什么我的性能基准给了我错误的结果?
- 如何利用STL在本期中获得更好的结果和性能
- 与单线程相比,c++/java的多线程性能结果参差不齐
- 不知道如何解释我的并行矩阵乘法代码的一些性能结果
- C++ eigen3 线性代数库,奇数性能结果
- c++矢量性能非直观结果
- 是否有使用可能/不可能提示的性能测试结果
- 递归会导致意想不到的性能结果