首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器(例如g++)在SSE优化(行重排序、操作排序)方面有多聪明?

编译器(例如g++)在SSE优化(行重排序、操作排序)方面有多聪明?
EN

Stack Overflow用户
提问于 2017-07-22 15:32:15
回答 1查看 117关注 0票数 1

在不讨论过早优化的情况下,我有几个关于g++或其他编译器在选择相关编译器标志时如何处理SSE优化的问题:

  1. 多行代码是否被重新排序,以便在成堆的行上执行SSE指令?例如: A= a1+a2+a3;x= a1* a1;a1= b1+b2+b3;x1 = b1*b1;a2 = c1+c2+c3;x2 = c1*c1; 编译器可以将这些行重新排序到两组SSE指令中?
  2. 编译器是否意识到什么时候应该采取类似的操作集,这些操作不在数组中,并将它们合并到SSE指令中?例如: A= a1+a2+a3;b= b1+b2+b3;c= c1+c2+c3;
  3. 编译器是否在用于SSE优化的for循环中优化指令?例如: (无符号int i= 0;i< 4;i++) { xi = xi*k;ai = ai*c;}

编译器在尝试优化时会合并1、2和3吗?

对于各种SSE优化编译器来说,听到人们对此的想法将是很有趣的。

编辑:我主要是问关于g++,但其他的“主流”编译器感兴趣。我也主要讨论浮点运算。

EN

回答 1

Stack Overflow用户

发布于 2017-07-22 15:42:56

根据我的经验,编译器在三年前对向量化做了真正的改进。目前,您的所有示例都将被高效地向量化。此外,如果您有机会使用Intel的编译器,您将得到一个巨大的速度,它的报告模式将为您提供有关它应用的优化的更多信息。

在我的日常生活中,我已经看到您可以拥有最疯狂的代码,但是对于计算部分,您应该帮助编译器并使用C方法提取指针并执行循环:

代码语言:javascript
复制
float * pa = whatever;      // data must be contigious
float * pb = whatever;

for (int i=0; i <n; ++i)
{
     pa[I] = pa[i]*pb[i];   // example
}

现在我们也有了OpenMP 4.5,它提供矢量化指令。。这将只比手写解决方案慢10% .因此,我不建议今天转移到本质,除非在非常具体的情况下,#pragma将无法工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45256252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档