| 2011年12月23日 07:00 | |
Intel C++ Compiler
上一章我们介绍过在软件优化中一个很重要的工具就是利用强大的编译器的自动优化选项,由于现在的编译器的优化支持越来越强大,而且利用自动优化选项而不是自己手动来修改代码进行优化可以大大减少用户所要花费的时间和精力,同时也便于移植,以后编译器或者硬件升级之后并不需要对于代码作修改就可以直接运行。本章首先介绍了如何使用Intel C++编译器,包括如何安装、运行和设置编译选项等,接着介绍了常用的编译器选项以及在何种情况下适合使用这些选项,最后通过几个例子介绍了Intel C++编译器支持的主要优化方法。
4.1 如何使用Intel C++ Compiler
Intel提供了特别针对Intel处理器进行优化的编译器,支持的语言包括C++和Fortran等,支持的操作系统包括Windows、Linux和MacOS。我们主要介绍Windows环境下的Intel编译器的C++版本,在作者编写这本书籍时,最新版本是10.0,下面的例子虽然都是使用10.0版本来运行和测试的,相信其基本思想在更早的版本和将来的版本以及其他操作系统如Linux等都可以适用。
Intel网站上面提供C++编译器的评估版本,评估版本和正式版本的功能一样,只是只能免费使用30天。注意到Intel C++编译器并不能单独安装,要求所要安装的机器上面预先安装好微软的C++开发环境,目前支持从Visual C++ 6.0开始一直到Visual Studio 2005,我们将以Visual Studio 2005为例来说明。一般说来Intel C++ Compiler支持所有Intel体系结构的机器,包括IA-32、IA-64(Intel Itanium® 2处理器)和Intel® 64(支持64比特扩展且运行64比特操作系统),另外Intel C++ Compiler还支持AMD的Athlon64和Opteron处理器。
图4.1 Intel C++编译器环境
编译器的安装非常简单,当然要求在此之前已经有安装好的微软的开发环境,运行相应的安装程序后按照安装程序的提示安装相应的编译器版本以及包括和微软开发环境集成的组件等,如果你的机器上装有多个微软的开发环境比如Visual C++ 6.0和Visual Studio 2005,安装程序会自动检测到,并提示是否安装与开发环境集成的组件。从图4.1中可以看到,同时装有两个开发环境,不过只有一个命令行的构建环境(在安装时选择哪一个微软开发环境),命令行的构建环境其实是和icl.cfg和iclvars.bat这两个文件相关,如果要利用另一个开发环境所集成的Intel C++编译器命令行只要复制这两个文件,并作相应的改动就可以了。这两个文件在<install-dir>\IA32\Bin目录中,其中iclvars.bat中首先调用微软开发环境中的相应环境变量设置的批处理文件,然后设置Intel C++ Compiler编译器要用到的环境变量的设置,包括执行文件搜索路径、License文件、共享文件、库、头文件目录等。icl.cfg给出希望保持与哪个微软开发环境的兼容性以及该开发环境的链接器linker所在的位置:
# Enable Microsoft Visual C++* .NET 8.0 compatibility
-Qvc8
# Path to Microsoft Visual C++* .NET 8.0 linker
-Qlocation,link,"C:\Program Files\Microsoft Visual Studio 8\VC\Bin"
# *Other names and brands may be claimed as the property of others
Intel C++ Compiler的编译命令为icl(在Linux系统中为icc),而连接器为xilink,注意其输出(比如通过选项-Qvc8编译)与微软开发环境是兼容的,这也意味着允许使用微软的库和obj文件,同样Intel编译器的obj文件也可以用于微软开发环境。Intel C++ Compiler支持多个编译选项,比如:
icl /O2 myprog.c
将试图采用O2选项(为速度而优化)来编译mygrog.c,然后调用xilink连接器来生成执行文件(执行文件名为myprog.exe)。当然你也可以通过选项来说明只需要编译成目标文件(.obj)或者生成汇编文件(.asm),前者的选项为/c,后者为/S。比如:
icl /O2 /c myprog.c
xilink是Intel的连接器,在作一些特殊的处理和优化之后最后会调用微软的连接器,注意你也可以直接用icl来代替xilink。
icl /O2 /c myprog.c
icl /O2 /c util.c
icl /O2 /c err.c
xilink /Fe myprog myprog.obj util.obj err.obj
为了能够使得上面的命令能够自动执行,许多程序员会采用一个makefile文件来描述要编译的文件、文件的依赖关系以及采用的选项,然后通过一个简单的nmake命令就可以了。假设原来的makefile为proj.mak,可以通过下列命令来采用Intel编译器:
nmake -f your_project.mak CPP=icl.exe LINK32=xilink.exe
图4.2 集成开发环境中采用Intel C++编译器
当然你也可以直接修改makefile文件来说明编译器和连接器采用Intel的版本,同时编译选项也作相应的修改。关于如何修改makefile可以参看其它的参考书籍或者示例。
除了命令行方式之外,你也可以直接使用集成了Intel C++编译器之后的微软开发环境,当然你需要把微软开发环境中的project转换为采用Intel C++编译器,图4.2给出了在Visual Studio 2005环境下的操作,选择相应的project,点击鼠标右键或者选择菜单project,最后选择“Convert to use Intel® C++ Project System”来完成转换操作,这时通过查看project的properties就可以看到相应的选项已经采用Intel的编译器了。
前面我们说过Intel编译器和微软开发环境是兼容的,因此也可以对某些文件采用原来的编译器,这是通过在project的properties界面上的General部分的Intel Specific栏进行选择,是采用Intel C++ Compiler还是Microsoft VC++ Compiler,如图4.3所示。在同一个界面上也可以看到Profiled-Guided Optimization(PGO)选项,该选项的目的是通过执行的结果的反馈来进行优化,具体的内容将在后面介绍。
图4.3 集成开发环境中project属性界面
通过选择project的properties page的C/C++或者Linker的Optimization项可以调整要采用的编译或者连接选项,从图4.4可以看出直接从图形界面上选择的选项为常用的选项,绝大部分情况下调整这些选项就可以了,但是如果要使用其它选项,则可以通过Command Line来进行。Command Line给出了当前编译源文件采用的编译选项,对于在界面上无法选择的选项可以通过Command Line窗口的Additional Options栏输入更多的编译选项。
图4.4 集成开发环境中查看编译选项
在微软开发环境中你也可以通过Tools的Options界面来配置Intel编译器的相关环境变量的信息,包括采用哪个版本的Intel编译器,当前编译器的执行文件、库、头文件以及缺省的选项信息,在这个界面上修改的信息实际上与前面介绍的两个配置文件:icl.cfg和iclvars.bat中的信息基本类似。

