当前位置: 首页 > news >正文

用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优化一把,说不定有意想不到的收获呢。

相关文章:

  • Azure设计模式之补偿事务模式
  • Azure设计模式之资源争竞下的消费者模式
  • 搜狗状告腾讯的几个重要看点
  • Azure 设计模式之资源整合
  • Azure 设计模式之事件源模式
  • 新加坡Ruby开发者6月聚会
  • Azure设计模式之外配存储模式
  • [Web 开发] URL 的最大长度
  • Azure设计模式之联邦身份模式
  • 从Oracle到DB2(四)--字符集
  • Azure设计模式之看门人模式
  • 圣淘沙闲逛,傻照两张!
  • Azure设计模式之网关模式
  • Azure设计模式之网关卸载模式
  • Makefile与Shell的问题
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Hibernate最全面试题
  • HTTP--网络协议分层,http历史(二)
  • JavaScript函数式编程(一)
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • spring + angular 实现导出excel
  • 阿里云购买磁盘后挂载
  • 仿天猫超市收藏抛物线动画工具库
  • 基于 Babel 的 npm 包最小化设置
  • 聚类分析——Kmeans
  • 用简单代码看卷积组块发展
  • 原生 js 实现移动端 Touch 滑动反弹
  • 《天龙八部3D》Unity技术方案揭秘
  • 选择阿里云数据库HBase版十大理由
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​如何防止网络攻击?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转载)(官方)UE4--图像编程----着色器开发
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 7 上传文件踩坑
  • .net中应用SQL缓存(实例使用)
  • :not(:first-child)和:not(:last-child)的用法
  • ?
  • @angular/cli项目构建--http(2)
  • @Controller和@RestController的区别?
  • @property括号内属性讲解
  • @SpringBootApplication 包含的三个注解及其含义
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [2544]最短路 (两种算法)(HDU)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式