我怎么知道我的代码是否正在由编译器向量化?


Answers:


10

使用任何现代年份的英特尔编译器,-O3 -vec-report3。优化级别三保证了它正在尝试向量化,向量报告将告诉您它在做什么。

关于矢量化的GNU页面说它默认处于优化级别3,但是我找不到vec-report的等效项。


感谢您及时的回复。我不知道-vec-report3。对于这种类型的东西(自动矢量化),您有编译器偏好吗?
马修·埃米特

英特尔编译器确实不错,但仅适用于英特尔芯片。您只需要添加所有正确的编译指示即可(#pragma ivdep最简单),GCC 4.7变得更好了,但与同事一起查看某些代码仍然存在错误(例如openmp编译指示内部没有向量化)。
aterrel 2012年

1
我建议仔细检查英特尔编译器如何在AMD芯片上进行矢量化。我不是100%肯定旧问题仍然存在。
Bill Barth 2012年

2
@BillBarth是的,仍然是一个问题。请参阅《优化声明》(在许多地方,例如,software.intel.com/ sites/products/collat​​eral/hpc/ compilers/…)。AMD在法庭诉讼中胜诉,要求英特尔披露它们具有反竞争性,而不是让它们停止存在。en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism 昂纳雾解决方法:agner.org/optimize/blog/read.php?i=49
杰德·布朗

@JedBrown,请确保SSE仍然很奇怪,但是AVX的故事是什么?这些链接表明一切正常(因为两家公司都实施了AVX),但我尚未在Bulldozer机器上对其进行测试。
Bill Barth 2012年


5

使用GNU编译器,添加-Wa,-ahl=asm.s会将生成的汇编代码转储到asm.s

对于Intel编译器,添加-fcode-asm -Faasm.s会将生成的代码转储到asm.s

然后,您可以检查汇编代码并查找矢量浮点运算。


我完全同意检查程序集的输出是确定代码是否实际矢量化的唯一可靠方法。没有什么要求编译器对他们对代码进行矢量化的要求诚实。
杰夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.