英特尔编译器与GCC
Intel Compiler versus GCC
当我用Intel的编译器编译一个应用程序时,它比我用GCC编译它时要慢。英特尔编译器的输出速度要慢2倍以上。应用程序包含几个嵌套循环。我遗漏的GCC和Intel编译器之间有任何差异吗?我需要打开一些其他标志来提高英特尔编译器的性能吗?我期望英特尔编译器至少和GCC一样快。
编译器版本:<>之前英特尔版本12.0.0 20101006GCC版本4.4.4 20100630之前
两个编译器的编译器标志相同:
-O3 -openmp -parallel -mSSE4.2 -Wall -pthread
我没有英特尔编译器的经验,所以我不能回答你是否缺少一些标志。
然而,根据我的回忆,gcc的最新版本通常在优化代码方面与icc一样好(有时更好,有时更差(尽管大多数来源似乎表明通常更好)),所以您可能会遇到icc特别糟糕的情况。每个编译器可以做哪些优化的示例可以在这里和这里找到。即使gcc通常不是更好,您也可以简单地遇到gcc识别为优化而icc不识别的情况。编译器对优化和不优化的东西非常挑剔,特别是在自动向量化方面。
如果循环足够小,比较gcc和icc之间生成的汇编代码可能是值得的。此外,如果你展示一些代码或至少告诉我们你在你的循环中做什么,我们可能能够给你更好的推测是什么导致这种行为。例如在某些情况下。如果它是一个相对较小的循环,则可能是icc缺少一个(或一些,但可能不是很多)优化的情况,这些优化要么具有固有的良好潜力(预取,自动向量化,展开,循环不变运动,…),要么启用其他优化(主要是内联)。
请注意,当我比较gcc和icc时,我只是在谈论优化潜力。最后,icc通常会比gcc生成更快的代码,但不是因为它做了更多的优化,而是因为它有一个更快的标准库实现,并且因为它在优化的地方更聪明(在高优化级别上,gcc对(理论上的)运行时改进的代码大小有点过于急切(或至少过去是这样)。这实际上会损害性能,例如,当仔细展开和矢量化的循环只执行了3次迭代时。
我通常使用-inline-level=1 -inline-forceinline
来确保我显式声明的inline
的函数实际上得到内联。除此之外,我希望ICC的性能至少与gcc一样好。您需要对代码进行概要分析,以了解性能差异的来源。如果这是Linux,那么我建议使用Zoom,您可以免费获得30天的评估。
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 初始化迭代器错误 C++ 在 GCC 编译器中
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 为什么 gcc 编译器标志未知?
- 如何使用 GCC 编译器优化创建静态库?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- gcc c++编译器中的零大小数组
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- template-id 与任何模板声明 GNU gcc 编译器都不匹配
- 关于 PBC 库在 GCC 编译器在 DEV C++ 中使用
- 选择默认的 gcc/g++ 编译器
- GCC编译器,为较低版本的GCC编译应用程序
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- GCC 编译器错误:stl_construct.h、stl_uninitialized.h
- 如何从我的qt应用程序运行gcc编译器?
- GCC 编译器错误:stl_construct.h
- 升级 gcc 编译器/其他修复程序以向后兼容
- GCC 编译器一个字节中有多少位