Algorithm 版 (精华区)

发信人: sino (茶水博士), 信区: Theory
标  题: mmx的开发工具
发信站: 哈工大紫丁香 (Sun Aug 27 13:29:38 2000), 转信

发信人: penguin (奈何企鹅), 信区: algorithm
发信站: NJU Lily BBS (Fri Jun 18 16:12:56 1999), 站内信件

     将已有程序转换成MMX程序的第一步,是分析应用程序是否适合采用 定点运算。那
些需要考虑累积误差的迭代运算、要求精度很高或范围很 大的运算一定要在浮点部件上
执行,不能应用MMX。对于可以应用MMX的 程序,以前可能也是用浮点数据参加运算,此
时首先要把变量和数据转 
换成定点数据。转换时要尽量保持有效数字,不损失数据的精度。第二 步是找出程序的
运算主体,将串行程序转换为并行程序。并非所有程序 都要用到MMX指令来加速,只有那
些循环执行的程序主体才是整个程序的 核心,它们也是最花时间的。只要对这一部分程
序进行加速,就可以提 
高整个系统的性能。例如MPEG II解码软件中IDCT变换是运算的核心,只 要将这一段操作
并行化,就可以大大减少系统的运行时间。因此,程序 员需要分析原程序中消耗时间的
程序主体,将这种循环(大部分是多重循 环)用汇编替代,就可以充分发挥MMX作用。
    由于MMX在汇编语言级增加了新的指令和数据操作类型,因此要想使用 MMX指令,必
须要熟悉这些指令和它们的格式。另外,这种指令是可以同 时处理以紧缩格式存储的多
个数据的SIMD并行指令,必须充分理解这种 
指令的使用方法,按照这种指令的要求去组织数据流,才有可能真正发 挥MMX的潜力。然
而这些要求对于普通程序员来说是太困难了,软件开发 人员顶多只能在高级语言级利用
并行性。我们所熟悉的并行语言(如并行 
C)一般都是针对多CPU环境下的多指令流多数据流(MIMD)并行处理,MMX 是“指令级并行
”RISC超标量结构,根本不能用并行C的思想实现任务的 分配与并行处理。因此,要想用
好MMX,必须要有一个很好的优化编译程 
序,将C语言源程序优化编译成MMX指令的目标代码。大家知道,在RISC 中,编译技术不
只是为了生成代码,更重要的是要优化代码。用优化编 译的时间来换取运行时间的高效
率,正是RISC技术的核心。由于当前还 没有这样的编译软件可用,不妨采取一些折衷的
方案: 
(1)在高级语言中嵌入MMX指令:微软的VC++4.2和Powersoft/Watcom C是 最早以嵌入式汇
编支持MMX扩展的C语言编译器。此外,Intel开发了几乎 与MMX指令一一对应的C指令库,
可以避免记忆繁琐的汇编格式、省去了 寄存器分配等操作,但是数据流的组织仍然要由
程序员完成。 
(2)用MMX指令实现标准库函数:Intel公司在奔腾系统中有两个面向多媒 体应用的库: 
信号处理库和模式识别库。这些库中包含了一些常用的操作,例如:FFT 、DCT、特征抽
取等。这两个库的老版本是用奔腾指令编写的,最新的 V3.0版本应用MMX指令实现,利用
6.11D版本的宏汇编语言连接到这两个库 ,就可以利用MMX指令。 
    需要注意的是,这些库函数的实现并不一定是最快最优的,它取决于实现 那些库函
数的程序员对于MMX技术的理解和应用水平以及快速算法的选择, 我们曾经自己设计实现
过一些算法,其效率可以比Intel给出的实例快出 25%左右。 
(3)数据流描述语言 
传统的算法语言是建立在计算机体系结构的控制流模型上的。打个比方, 控制流模型计
算机就象是一个听话的学徒工,按照师傅教授的工艺流程 一步一步的工作。按照这个模
型,并行计算机就象是一大群学徒工,师 
傅不仅要为每一个学徒工制定完整的工艺流程,还必须负责协调他们的 工作进度,必要
时还要调换他们的工种,以利于资源被最大限度的利用 。然而,在计算机的算法描述中
,控制流的描述并不是本质的。例如两 个向量的加法,既可以用循环结构写成: 
for (i=0; j<8; i++) c[i]= a[i] +b[i]; 
也可以用顺序结构写成: 
c[0]= a[0] + b[0]; c[1]= a[1] + b[1]; 
c[2]= a[2] + b[2]; c[3]= a[3] + b[3]; 
c[4]= a[4] + b[4]; c[5]= a[5] + b[5]; 
c[6]= a[6] + b[6]; c[7]= a[7] + b[7]; 
同样也可以写成混合的折衷形式: 
for (i=0; j<8; i++2) { c[i]= a[i] +b[i]; c[i+1]= a[i+1] +b[i+1];}
或者 for (i=0; i<4; i++) c[i]= a[i] +b[i]; 
for (j=0; j<4; j++) c[7-j]= a[7-j] +b[7-j]; 
等等多种形式,而所有这些程序段都是完全等效的。保证这些程序段功能 相同的本质因
素就 是数据流。也就是说,一个算法的功能被其数 据流唯一地确定。这类似于邮递员,
他只保证将你的数据(信件)准确地送 到指定的目的地,至于他是履行了什么样的控制流
程(手续)才送到的,这 
当然与他工作的效率有关,却与他的基本功能没有关系。很明显,面向数 据流的描述比
面向控制流的描述更适合于并行的计算机体系结构,一大群 邮递员的工作只是一个邮递
员工作安排的迭加,比安排一大群学徒工要容 易多了。 
 

--
※ 修改:.fib 於 Aug 27 13:27:17 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.南京大学小百合 bbs.nju.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: fib.bbs@bbs.nju.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.364毫秒