Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;特征3线性代数库,奇数性能结果 我已经在C++中使用了Eng3线性代数库,我一直试图利用矢量化的性能优势。今天,我决定测试矢量化能在多大程度上加速我的程序。因此,我编写了以下测试程序:_C++_Performance_Gcc_Vectorization_Eigen - Fatal编程技术网

C++;特征3线性代数库,奇数性能结果 我已经在C++中使用了Eng3线性代数库,我一直试图利用矢量化的性能优势。今天,我决定测试矢量化能在多大程度上加速我的程序。因此,我编写了以下测试程序:

C++;特征3线性代数库,奇数性能结果 我已经在C++中使用了Eng3线性代数库,我一直试图利用矢量化的性能优势。今天,我决定测试矢量化能在多大程度上加速我的程序。因此,我编写了以下测试程序:,c++,performance,gcc,vectorization,eigen,C++,Performance,Gcc,Vectorization,Eigen,---特征测试--- 以下是我的相关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 3dn

---特征测试---

以下是我的相关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,eigen3还是gcc


编辑:为了消除任何疑问,我现在尝试添加了
-DEIGEN\u DONT\u ALIGN
编译器选项,用于测量无矢量化情况下的性能,结果相同。此外,当我添加
-DEIGEN\u DONT\u ALIGN
-march=native
时,结果与没有
-march=native
的情况非常接近,编译器似乎比您想象的更聪明,并且仍然优化了很多内容

在我的平台上,不使用
-march=native
的情况下,我可以获得大约9ms的时间,而使用
-march=native
的情况下,我可以获得大约39ms的时间。但是,如果我将返回上方的行替换为

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

std::coutwhich g++版本?在我的平台(英特尔Q9550)上,无论我是否使用march=native,我都能获得相同的速度-但是,O3会导致侵蚀性内联、使用SSE和展开。添加-mss3会导致程序集略有不同,运行时性能完全相同。我对segfault没有真正理解你的意思,你有一组编译器标志让你的程序崩溃吗?@KillianDS我的gcc版本:
gcc--version
gcc(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2
@Bob我曾试图通过在
Vector2d
成员之前定义一个带有
char
成员的类,而不使用
EIGEN\u MAKE\u ALIGNED\u OPERATOR\u NEW
,然后使用NEW创建一个对象,并使用
-NDEBUG
编译以绕过断言,故意设置一个向量化问题。如果没有
-march=native
,我会从计算中得到正确的结果,并由此产生分段错误。这告诉我矢量化不能在没有-march的情况下使用。捕捉得好!编译器确实比我想象的要聪明。仅供参考,我已经运行了相同的测试,在我的
英特尔(R)核心(TM)i3 CPU M 350@2.27GHz
上,我得到的是42ms vs.112ms,明天我将对问题中提到的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
std::cout<<accumulator<<"\n";