英特尔® Composer XE 2013 入门,编译器标注与指示

面向英特尔® MIC 架构的编译器方法
英特尔® Composer XE 2013 入门编译器标注与指示

概述

编译器选项可帮助用户控制源文件的理解方式以及目标文件或可执行文件的特征。编译器选项适用于整个源文件。如果您有需要控制的循环、变量、函数或程序,您怎么办?这就需要使用编译器标注与指示了。在本章中,我们将查找关于标注与指示的文档,并重点介绍对提高英特尔® 至强® 处理器或英特尔® 至强融核协处理器的运行性能最有用的。

主题

C/C++ “标注”是由英特尔 C++ 编译器解读的命令并帮助指导编译过程中的编译器操作。而 Fortran “指示”是由英特尔 Fortran 编译器解读的命令并帮助编译过程中的编译器操作。C++ 标注和 Fortran 指示的语法明显不同。然而,为这种英特尔编译器指派的操作通常一样。

C++ 标注标注是针对特定场景指导编译器操作的指示。例如,您可以使用 novector 标注指明一个循环不得矢量化。keyword # 标注在 C++ 语言中是标准的,但是 individual 标注是由机器指定或由操作系统指定的,并随编译器不同而不同。
一些标注具有和编译器选项同样的功能。标注覆盖行为由编译器选项指定。
一些标注同时适用于英特尔和非英特尔处理器,但是相对于非英特尔处理器,对英特尔® 处理器需要进行优化。请参考 individual 标注页面了解详细说明。

关于 C++ 标注的文档可由英特尔® C/C++ Composer XE 编译器识别标注可参阅产品文档《英特尔® C++ Compiler XE 用户与参考指南》。如果您忘记文档地址,请在《新用户编译器基本用法》中查找相关信息。在《用户与参考指南目录》中依次打开章节《编译器参考》、《标注》、《概述/英特尔® C++ 编译器标注》

Fortran 指示编译器指示是指导编译操作的特殊命令。由英特尔® Fortran Composer XE 识别的指示对该编译器来说是独一无二的。编译器指示覆盖任何编译器操作。

关于指示的文档可由英特尔® Fortran Composer XE 编译器识别指示可参阅产品文档《英特尔® Fortran Compiler XE 用户与参考指南》。如果您忘记文档地址,请在《新用户编译器基本用法》中查找相关信息。在《用户与参考指南目录》中依次打开章节《语言参考》、《指示增强式编译》、《指示增强式编译概述》

以下标注/指示同时适用于 C++ Fortran必须理解。请打开您的浏览器窗口,定位至上述标注/指示文档。研究您所用语言的标注/指示。在下文描述中,C++ Fortran 语法的排列顺序是 C++/Fortran

·         simd/SIMD – 这些指示可帮助程序员强制实施矢量化。SIMD 控制是有力工具。请阅读下文了解 SIMD。如果您正在使用 IVDEP,请考虑迁移至 SIMD
矢量化:标注/指示 SIMD IVDEP 标注/指示告诉编译器忽略循环中的假定矢量关联(矢量化目标)。为了确保正确编码,编译器将假定关联视为可靠关联,防止矢量化。该标准覆盖这一决定。使用这一标注之前您必须确定假定循环关联可以忽略。请注意:该指示仅影响存在假定关联的循环。如果关联是百分之百确定的,编译器将忽略这一指示。如需更高控制,请考虑使用标注/指示 SIMD

·         loop_count/LOOP COUNT – 这一标注/指示告诉编译器针对循环进行相关迭代。这一点很重要,因为很多循环都存在一些变量限制并且只有当编译器运行时才知道这些限制。编译器试图判断某个循环中的迭代次数以及循环中的工作量,以便进而判断该循环的矢量化是否“有利” 也就是说考虑到创建这一矢量化循环所需的开销以后,该循环的矢量化是否还有性能优势。由于编译器通常无法在编译时间判断循环运行次数,所以它可能拒绝对该循环进行矢量化。-vec-report 将报告这些非矢量化的循环为不利可能不利。这些指示可支持程序员为编译器提供关于预期循环运行次数的信息从而帮助分析是否有利。

·         vector/VECTOR - novector/NOVECTOR – 覆盖编译器选项针对循环矢量化和强制矢量化如果合法。另外如果编译器百分之百肯定循环中存在关联就会忽略这一指示。novector 指示通常用于防止那些如果进行矢量化则会出现计数精确性的循环的矢量化。

·         inline,forceinline,noinline/INLINE,FORCEINLINE,NOINLINE – 为编译器代码嵌入启发提供精细控制。

·         unroll/UNROLL, nounroll/NOUNROLL, unroll_and_jam/UNROLL_AND_JAM – 这些指示禁用或启用循环展开(和抑制)unroll 告诉编译器优化程序循环展开的次数。这有助于矢量化。unroll_and_jam 指示部分展开较高位的一个或多个循环而非最深处的循环并合并(抑制) 结果循环。这一转换可支持循环的再利用。unroll_and_jam 指示仅对三级优化(O3)有效。

·         nofusion/NOFUSION – 防止循环合并优化。

此外还有更多标注/指示。以上是关键优化标注/指示,每个希望提高性能的程序员都应当熟悉。再次强调一下,请抽时间熟悉上述标注/指示。

提示

SIMD 指示可有效支持程序员控制循环矢量化。IVDEP VECTOR 是之前较弱的选项,也可为编译器提供建议或提示信息。然而,如果编译器肯定循环中存在关联,则可忽略 IVDEP VECTOR。在结束本章之前,您应当回顾《矢量化:标注/指示 SIMD:这是矢量化的关键,也是提高英特尔® 至强融合协处理器的关键。

下一步工作

要在英特尔® 至强融核协处理器上成功调试您的应用请务必通读此指南并点击文中的超链接查看相关内容。本指南提供了实现最佳应用性能所要执行的步骤。

返回章节《新用户编译器基本用法》

附件尺寸
下载 simd.upate.pdf3.69 MB
如需更全面地了解编译器优化,请参阅优化注意事项