我的C++编译器会优化我的代码吗?

6

在使用现代C++编译器(包括MSVC,GCC,ICC)时,如何判断它是否已经:

  1. 并行化代码
  2. 向量化循环(或使用其他特定的处理器指令)
  3. 展开循环
  4. 检测到尾递归
  5. 执行RVO(返回值优化)
  6. 或以其他方式进行了优化

而不必深入到编译器生成的汇编代码中?


这是一篇关于特定优化集合的好文章,你可能会发现它很有用:http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ - LiraNuna
4个回答

18

你能够真正地判断的唯一方法是检查汇编输出(但你好像已经忽略了这个步骤)。除此之外,你可以阅读文档,了解编译器每个优化级别提供的优化类型。

但说实话,如果你不相信编译器的优化级别能够胜任工作,那么你可能也不会相信文档 :-)

我会亲自查看汇编代码,这是唯一可以让你真正确定的方法。


严格来说,这不是唯一的方法,但可能是最容易或最好的方法。 您可以使用 -fdump... 和 -d 选项指示 gcc 在传递之间生成详细转储(主要用于调试),并且对于矢量化,存在详细的优化消息,解释循环何时以及在哪里进行了矢量化,这也适用于最终用户。 - Gunther Piez
严格来说,那些转储数据可能会有误。 ;) 只有汇编代码能够保证是正确的。 :) - jalf
@jalf:不,微软和/或GNU可能与英特尔和/或AMD串通一气,这意味着CPU在编译器代码中隐蔽地嵌入标识符,并切换到特殊模式,以便那些明显的向量操作码被去向量化,根本不使用SIMD电路。如果你想要愚弄自己的话;-) - Steve Jessop
关于不信任文档的问题:https://dev59.com/cUrSa4cB1Zd3GeqPWXKY#1782219 - int3

3

英特尔编译器具有不错的报告功能。在参考文档或手册中查找-vec-report和-par-report。

g++也有向量报告,可以在手册中查找“vector”,但我认为g++没有并行自动代码生成。

至于最后三件事,我认为编译器不会报告,所以您可能需要查看汇编代码以获取该信息。


GCC具有自动并行化功能,使用“-ftree-vectorize”选项。在此处阅读更多相关信息 - http://gcc.gnu.org/projects/tree-ssa/vectorization.html - LiraNuna
并行化通常在编译器中意味着OpenMP,向量化通常意味着SIMD指令。g++没有前者。 - Anycorn

0

我非常确信,如果您在编译器中使用最深度的优化,那么代码将被并行化,循环将被向量化,并且许多其他向量化技术也将起作用。

为了使用如此多的深度,请在运行代码时使用-O3命令。


0
对于RVO或其他复制省略技术,只需在类的复制构造函数和析构函数中添加一些日志记录(printf)。如果优化工作正常,您应该看到复制的对象数量减少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接