用ICC编译MP3编码器LAME

Author: Xiaoping Duan (Intel)

LAME 是目前最常用的一个开源MP3编码软件,从1998年12月至今,Lame已被越来越多人的公认为是MP3压缩的最佳利器。Lame编码出来的MP3音色纯厚、空间宽广、低音清晰、细节表现良好,它独创的心理音响模型技术保证了CD音频还原的真实性。在这里我们就用它作例子来展示一下如何用英特尔的C++编译器来编译一个开源程序。LAME本身是一个跨平台的软件,支持常见的Windows和Linux平台,这里我们使用的是Linux系统。

1. 首先你要到LAME的网站上下载其源代码包(通常这是一个.tgz文件),然后把这个.tgz文件解压缩到一个目录下。解压缩过程会生成一个新的子目录,目录名通常就是lame后面跟上版本号。

2. 接下来我们要进入到生成的子目录中配置编译环境。通常如果使用的是系统缺省的GCC编译器的话我们只需简单的运行当前目录下的配置脚本“./configure”即可。但是由于这里我们打算使用英特尔编译器,所以我们得先配置好英特尔编译器的工作环境,然后再进行通常的编译配置。这可以通过运行下面的命令来完成:

B Shell环境:

source <英特尔编译器安装目录>/bin/iccvars.sh

或者

C Shell 环境:

source <英特尔编译器安装目录>/bin/iccvars.csh

3. 配置好英特尔编译器工作环境后可以运行”icc –V”命令来验证一下icc是否工作:
$ icc -V
Intel(R) C Compiler for applications running on IA-32, Version 10.1 Build 20080212 Package ID: l_cc_p_10.1.013
Copyright (C) 1985-2008 Intel Corporation. All rights reserved.

4. 接下来我们回到通常的编译配置。这时我们就不能简单的运行configure脚本了,因为我们要指定英特尔编译器,而不是使用系统缺省的GCC:

./configure CC=icc CFLAGS="-fast" CXX=icpc CXXFLAGS="-fast" AR=xiar

5. configure脚本运行完后会生成相应的make file,接下来再运行make命令就可以编译lame了。

6. 编译完毕后可以运行frontend目录下生成的lame来压缩一个wav文件,看看是否生成相应的mp3文件。

这里对configure命令中传的几个参数作一下简单的解释:

CC=icc 指明接下来的编译过程使用英特尔编译器icc来编译C语言.c文件
CFLAGS="-fast" 指明icc的编译选项用"-fast"。-fast的含义等同于“-xT -O3 -ipo -no-prec-div -static".-xT表明使用最新的Core 2微架构处理器提供的指令集,-O3表明使用最高的优化级别“3”,-no-prec-div指明使用乘倒数来替代除法,-static表示采用静态链接,-ipo表示要进行过程间的优化
CXX=icpc 指明编译过程使用英特尔编译器icpc来编译C++文件,即.cpp文件。
CXXFLAGS="-fast" 指明icpc编译.cpp文件时使用'-fast"选项
AR=xiar 指明编译过程中使用xiar而不是通常的ar来生成静态库.a文件。这里必须使用xiar的原因是因为我们在编译时期用了IPO优化,普通的ar程序无法处理含有IPO信息的.o文件,会导致最后的链接出现找不到某些函数符号的错误。使用英特尔的xiar就可以避免这个错误,因为xiar可以处理IPO.


提示:

1。 在编译的过程中会看到很多的warning警告信息,其中大部分可以忽略。这是因为英特尔编译器的语法检查要比GCC严格一些,编译时会报出更多的语言使用警告信息。如果你不想在屏幕上看到太多的警告信息的话,可以在CFLAGS和CXXFLAGS的参数中加入“-w”把所有的警告信息关掉。


2。编译过程中编译器会打印出很多类似下面的remark信息。

   psymodel.c(1846): (col. 2) remark: LOOP WAS VECTORIZED.
   psymodel.c(1771): (col. 2) remark: LOOP WAS VECTORIZED.
   psymodel.c(1885): (col. 2) remark: LOOP WAS VECTORIZED.
   psymodel.c(1890): (col. 2) remark: LOOP WAS VECTORIZED.
   psymodel.c(1895): (col. 6) remark: PARTIAL LOOP WAS VECTORIZED.

这些remark信息显示某些源文件(psymodel.c)中的某行代码(1846,1771...)上的循环结构被编译器成功的进行了向量化,也就是编译器对这些循环生成了SSE指令。SSE指令可以在单条指令中执行以前多次循环操作才能完成的功能,从而加快了程序执行速度。


3。这里给出的步骤适合于很多使用标准configure脚本进行配置,然后用make进行编译的开源程序。有兴趣的话你也可以把你感兴趣的程序拿来用icc优化一把,说不定有意想不到的收获呢。

你可能感兴趣的:(C++,c,linux,C#,英特尔)