已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 y7 7 0 9 6 g 随着多媒体应用程序对处理器处理能力的要求越来越高,大部分处理器生产厂商都在 处理器内部都提供r 专门用于多媒体处理的指令,这些指令被称为s i m d ( s i n g l ei n s t r u c t i o n m u l t i p l ed a t a ) 指令。只要把操作数打包存放在寄存器或内存中的,就可以利用这些s i m d 指令并发地执行若干次运算操作。白从1 9 9 4 年h p 公司首次将m a x 一1 指令集引入了通用芯 片p a 一7 1 0 0 l c ,s i m d 体系结构就成为了通用芯片提高多媒体应用程序性能的重要手段。a i d d 公司在他们的c p u 中加入了3 dn o w ! 和对s s e 、s s e 2 的支持,i n t e l 公司则于2 0 0 4 年在他们 的p e n t i u m4p r e s c o t t 芯片中加入了最新的s s e 3 扩展。与传统指令相比,s i m d 指令能大 幅度提高多媒体应用程序的性能。因此,软件开发人员对s i m d 指令集表现出极大的兴趣, 越来越多的应用程序针对s i m d 指令集做了优化。 尽管基于寄存器的s i m d 构架已经面世十年,能生成s i m d 指令的商用编译器很少 还有一些处于研究阶段的支持s i m d 自动优化的编译器,他们往往只能识别相当明显的可并 行代码,而且只对少数几个测试程序有比较好的效果。对于软件开发人员来说,这意味着他 们通常必须通过内嵌汇编和内部函数( i n t r i n s i c s ) 的形式来利用s i m d 指令米提高软件的性 能,这就要求开发人员必须十分熟悉相关的s i m d 指令。同时,这样的程序也十分依赖于机 器,降低了程序的可移植性。因此,一个具有自动s i m d 优化能力的编译器非常的重要,人 们很希望能把利用s i m d 指令提高性能的工作交给编译器来完成。 本文通过在i a 3 2 平台上对多媒体测试程序包b e r k e l e ym u l t i m e d i ab e n c h m a r k ( b m w ) 的分析,找出编译器进行s i m d 优化的障碍,提出了数个需要解决的问题,并针对这些问题 提出了相应的算法。从实验中也看到,这些算法的确解决了问题,并晟终提高了b m w 的性 能。最后总结分析发掘潜在并行性的经验,以便今后能运用在编译器的优化分析中。 关键字:s i m d ;编译优化;向量化:自动优化 a b s t r a c t d u et oi n c r e a s i n gd e m a n do nc a p a b i l i t yo f p r o c e s s o ri nm u l t i m e d i aa p p l i c a t i o n s ,m o s t p r o c e s s o rv e n d o r sh a v eb r o u g h tm u l t i m e d i ae x t e n s i o n si n t ot h e i rp r o c e s s o r s t h en e w i n s t r u c t i o n sf r o mt h e s ee x t e n s i o n sa r ek n o w na ss i m d ( s i n g l ei n s t r u c t i o nm u l t i p l ed a t a ) i n s t r u c t i o n s ,w i t hw h i c hac o u p l eo f c o m p u t a t i o n a lo p e r a t i o n sc a nb ee x e c u t e dc o n c u r r e n t l yo n p a c k e do p e r a n t s i n1 9 9 4 ,h pi n t r o d u c e dm a x - 1i n s t r u c t i o n si nt h e i rg e n e r a l - p u r p o s ec h i p p a - 7 1 0 0 l c s i n c et h e n ,s i m da r c h i t e c t u r eb e c a m ea l li m p o a a n tm e t h o df o rc h i pd e s i g n e rt o i m p r o v em u l t i m e d i aa p p l i c a t i o np e r f o l l n a l a c e a m da d d e d3 dn o w ! ,s s ee x t e n s i o na n ds s e 2 e x t e n s i o nt ot h e i rc p u sa sw e l la si n t e li n t r o d u c e ds s e 3e x t e n s i o ni np e n t i u m4p r e s c o t ti n2 0 0 4 a sm u l t i m e d i aa p p l i c a t i o np e r f o r m a n c ei sb o o s t e dw i t hs i m di n s t r u c t i o n s ,s o f t w a r ed e v e l o p e r s a r ei n t e r e s t e di ns i m dv e r ym u c h m o r ea n dm o r ea p p l i c a t i o n sa r eo p t i m i z e dw i t hs i m d i n s t r u c t i o n s a l t h o u g hs i m da r c h i t e c t u r eb a s e do nr e g i s t e r sh a sb e e na v a i l a b l ef o rad e c a d e ,c u r r e n t c o m p i l e r sa r es t i l ll a c ko fa u t o m a t i co p t i m i z a t i o na b i l i t yb yu t i l i z i n gt h e s ep l a t f o r m - d e p e n d e n t e x t e n s i o n s ,i n c l u d i n gc o m m e r c i a lc o m p i l e r sa n dt h o s er e s e a r c h p u r p o s ec o m p i l e r s o n l y af e w o f t h e mc a ng e n e r a t es i m dc o d e t od a t e ,m o s tc o d et h a te x p l o i tt h e s ee x t e n s i o n sa r e h a n d - c o d e db ys o f t w a r ed e v e l o p e r s i no r d e rt ot a k ea d v a n t a g eo f t h em u l t i m e d i ae x t e n s i o n s , d e v e l o p e r sh a v et ou s ei n l i n ea s s e m b l ya n d o ri n t r i n s i cf u n c t i o n s ,w h i c hh u r tr e a d a b i l i t ya n d p o r t a b i l i t yo fa p p l i c a t i o n sm u c h a n do n l yk n o w l e d g e a b l ed e v e l o p e r sa r ea b l et oc o d ew i t h s i m di n s t r u c t i o n sb yh a n d s t h e r e f o r e ,i ti sv e r yi m p o r t a n tt od os o m er e s e a r c hi na u t o m a t i c s i m do p t i m i z a t i o n a n d p e o p l ea r el o o k i n gf o r w a r dac o m p i l e rw i t ht h i sa b i l i t y t h i sp a p e ra n a l y z e sa no p e ns o u r c eb e n c h m a r ks u i tb e r k e l e ym u l t i m e d i ab e n c h m a r k ( b m w ) a n di d e n t i f i e so b s t a c l e st h a tp r e v e n t c o m p i l e rf r o mv e e t o r i z i n gt h es o u r c ec o d e w eb r o u g h tu p w i t hs o m ep r o b l e m sa n da l g o r i t h m sf o rs o m eo f t h e mi no u rr e s e a r c h i no u r e x p e r i m e n t s w e d i do b s e r v e dc o n s i d e r a b l ep e r f o r m a n c ei m p r o v e m e n t si nb m wa f t e ra p p l y i n gt h o s ea l g o r i t h m s k e y w o r d :s i m d ,c o m p i l a t i o no p t i m i z a t i o n ,v e c t o r i z a t i o n ,a u t o m a t i co p t i m i z a t i o n 一、s i m d 技术简介 第一章引言 通常通用处理器的数据通路能都达到3 2 位甚至6 4 位宽,而大多数典型的多媒体应用 程序仅需要进行8 位或者1 6 位的运算。为了充分利用这些额外的数据带宽,硬件设计者引 入了单指令多数据流( s i m d ) 的概念,这样就使得那些剩余的数据带宽也能被充分地利j l j 起来。 随着硬件技术的发展,越来越多的s i m d 构架被整合在通用处理器或者d s p 芯片中。 例如,i n t e l 在p e n t i u mi l l i v 芯片中实现了基于寄存器的s i m d 构架并在这一构架基础上 提供了s s e s s e 2 s s e 3 指令集。这个构架提供了八个1 2 8 位的x m m 寄存器。它可以一次 读写1 2 8 位数据或者进行1 2 8 位的运算,这1 2 8 位数据可以是紧密排列在一起的1 6 个8 位 数据,8 个1 6 位数据或者4 个3 2 位数据。类似的a m d 也将s i m d 构架整合在了他们的通 用芯片中,并提供了3 d n o w 指令集。而p h i l i p s 在他们的t r i m e d i a 芯片中也提供了一些简 单的s i m d 指令。 下图表示了一个典型的s i m d 计算。两组数据各包含四个数据单元,每对数据单元x 1 雨iy 1 、x 2 和y 2 、x 3 和y 3 、x 4 和y 4 都执行了相同的操作,得到的是四个运算结果。 在i a 一3 2i n t e l 指令集手册【1 0 】的附录中,有一章“i n t e lc c 十+ c o m p i l e ri n t r i n s i c sa n d f u n c t i o ne q u i v a l e n t s ”,列出了所有的i n t r i n s i c 以及对应的指令。i n t r i n s i c 在c c + + 程序中的 语法是以函数形式出现,编译时可以直接翻译为一条s i m d 指令( 复合情况会生成最直接的 几条) ,换言之,如果不使用i n t r i n s i c ,可能需要多条c c + + 语句完成,而编译器却并不能 保证将这几条语句能够生成这条最高效的s i m d 指令。并不是每条s i m d 指令都有对等的 i n t r i n s i c , 手册的附录中列山了所有的,它们分为简单型( s i m p l e ) 和复合型( c o m p o s i t e ) 两种,每个简单型的就是对应一条指令,而复合型则对应多条指令。 i a - 3 2 体系架构的s i m d 指令主要分为以下几类1 9 】: m m x 技术 s s e s s e 2 s s e 3 扩展 m m x s s e 类扩展引入了s i m d ( 单指令多数据) 的执行模式,可用于加速多媒体应用。 r 面简要介量f _ 一f 这些指令的执行环境和特征。 m m x 技术 i n t e l 在p e n t i u m 处理器和p e n t i u m1 1 处理器中首次引入了第一个s i m d 扩展6 4 何 m m x 技术。这个技术由以下扩展组成: 8 个6 4 位m m x 寄存器:m m o 到m m 7 ; 4 个6 4 位的整型数据类型:8p a c k e db y t e s ,4p a c k e dw o r d s ,2p a c k e dd w o r d s ,lq w o r d : 支持6 4 位整型的新指令。 百忑一 图i - 2 m m x 技术 如图2 - 2 所示,m m x 寄存器与f p u ( 浮点运算单元) 的寄存器在物理上是有部分重叠 的,冈此,在使用f p u 指令厉必须要清空f p u 栈才能使用m m x 指令,反之亦然。m m x 的数学运算指令能以回转( w r a p a r o u n d ) 或者饱和( s a t u r a t i o n ) 的方式同时处理多个数据。 s t r e a m i n gs s e 扩展( s s e i s s e 2 s s e 3 ) p e n t i u ml i i 引入了1 2 8 位s s e 扩展,能支持p a c k e d 单精度浮点数。在p e m i u m4 处理器 中有依次引入了s s e 2 和s s e 3 。这些扩展能支持p a c k e d 双精度的浮点数和整型。 8 个1 2 8 位寄存器:x m m 0 到x m m 7 : 2 个1 2 8 位浮点和4 个1 2 8 位整数类型: o 4 个p a c k e d 单精度和2 个p a c k e d 双精度浮点数: o 1 6 个p a c k e d 字节,8 个p a c k e d 单字,4 个p a c k e d 双字,2 个p a c k e d 四字: 支持1 2 8 位浮点和整数操作的新指令。 2 x m m 7 | x n y n 6 x m n 5 ) l :l r l m 4 m m 3 x n 明2 r n l l i 舯m o d l t d ( i 1 3 i 2 l f l l f 0 6 i 娃 1 j l j 订i 稍i 稍i l 们i 们i _ i1 呐 l 小h k l 3 l 1 2 卜l 如i i h l l , - i | w “i fi - i ”i t l l 图1 - 3s t r e a m i n gs i m d 扩展 而且s s e s s e 2 s s e 3 还增加了对数据s h u f f l e 、c a c h e 控制和内存o r d e r i n g 的新指令,比 如预取指令。 在s t r e a m i n gs i m d 扩展中,有对齐和非对齐两种1 2 8 位数据移动方式。比如m o v a p s 指令是将对齐的1 2 8 位数据从内存移动到x m m 寄存器中或从x m m 寄存器移动到x m m 寄存 器。内存地址必须是按1 6 字符对齐的,否则将会产生一个异常。如果内存地址不是1 6 字节 对齐的,则要使用非对齐移动指令,l :l 女nm o v u p s 指令,但这些指令是比较低效的。对齐的 内存地址可以直接作为大多数s i m d 指令的操作数,而非对齐的内存地址必须先被读入一个 x m m 寄存器。 二、s i m d 优化简介 直到现在,大部分向量化的工作仍然是通过开发人员使i l ! i 汇编语句、i n t r i n s i c 函数或者 高级语言的扩展来完成的。虽然这种方法的确十分高效,但是缺点也显而易见,比如降低了 程序的可读性、易维护性、可移植性。囡此开发人员仍然希望编译器能自动完成寄存器间向 精化。在自动向量化领域,我们可以看到已经有不少成熟的研究文章发表i i ,2 ,3 ,4 ,5 1 ,住这 些文章中提出了不少编译技术能把串行代码转换为向量形式。编译器自动向量化还能减少人 为因素而带来的源代码编写错误,而且减轻了开发人员的工作。自动向量化编译器还可以有 效地向量化现有的应用程序,不需要应用程序的所有者再次投入资金来重写代码来利用 s i m d 指令,而这些投资往往是十分巨大的。若实现了自动向量化编译器还能根据目标平 台的不同指令的延迟、c a c h el i n e 的大小来实现不同的指令调度、生成,这是应用程序开发 人员很难做到的。 三、i n t e l 编译器在s i m d 优化方面的介绍 i n t e lc h 编译器和i n t e lf o r t r a n 编译器是相当成功的支持自动向量化的商业化编译器。 a a r t 等人在自动向量化方面做了很多研究,并成功地将这些研究被应用到了i n t e l 编译器中。 下面我们将简单介绍a a r t 等人在这方面的研究。 在a a r t 等人的研究【1 4 】中,使用了一个新名词一一寄存器间向量化( i n t r a - r e g i s t e r v e c t o r i z a t i o n ) 。它指的是把串行代码转换为利用m m x 或s s e s s e 2 s s e 3 的代码。i n t e l 编译 器白动向量化的工作由三部分组成:代码分析、代码重构造和向量代码生成。 代码分析主要有控制流分析、数据流分析和数据依赖分析组成。编译器尝试通过这些分 析来发现代码中潜在的并行性。数据依赖分析则由一系列的测试组成,这些测试在结果的准 确度上是逐渐提高的,但准确度的提高是以时间和空间为代价的。首先编泽器会用虽简单 的测试去检查代码中内存引州的数据依赖关系。如果测试成功,则表明这段代码不存在数据 以来关系可以并行执行。而如果测试失败编译器会尝试更复杂的测试,这些测试将消耗 更多的时间及空间。 代码重构主要着重于将代码进行等价变换,使得变换后的代码更容易分析、更容易进行 向苗化。例如如果静态的数据依赖信息无法证明一段代码是无依赖的,那么i n t e l 编译器 可以生成动态数据依赖分析代码,用来在运行时分析数据以来关系,尝试找出代码潜在的并 行陛。对于如下这段代码, p l p + 4 l jp h 。p + 日+ u j q l q + 4 l jq h - q + 4 。u ; i fc p h qh) l o o pw i t h o u td a t ad e p e n d e n c e _ +f o r ( i = l ji=uji ) p 【i 】= q 【i e l s e + l o o pw i t hp o t e n t i a lo v e r l a p f o r ( i = l ji=uji + + ) p 【i 】= q 【i ) i n t e l 编译器生成了两个版本的循环( 如右边的代码) ,通过i f 语句在运行的时候检奇数据依 赖情况,编译器会知道第一个循环不存在数据依赖情况,因此可以做向量化而第二个循环 不行。 另一个代码重构的例子是循环互换( l o o pi n t e r c h a n g e ) 。请看下面的代码段, f o r ( := 0 ;i n j i + 十 f o r ( = 07 ( n jj + 十) f o r ( k = o jk n ik + + ) f c 【i 】【 1 = c i 】( 】+ a i 【k + b 【k 1 【j 1 j f o r ( i = o j i ( n ;i 十+ ) f o r ( k = 0 jj n ? j + + 】 f o r ( j = 0 ;k n j k + + 1 t c i 1 【j 】= c 【i 】f 】+ a 【i 】【k 1 + b 【k 1 、 在做循环互换前,b k 【i 是非u n i ts t r i d e 的内存访问,造成了c a c h e 的利用率和命中率不高。 当把循环i 与循环k 进行互换后,所有的数组访问都变成了连续的内存访问,大大提高了 c a c h e 的利用率。 i n t e l 编译器的代码重构功能还包括常量扩散、循环分布、模式识别( 如识别归约r e d u c t i o n 运算、晟值运算、饱和运算) 等等。在多媒体应用程序尤其是音频和图象处理程序中,通 常会运用到饱和运算( s a t u r a t i o n ) 和最值运算( c l i p p i n g ) 。由于在c c + + 语言里没有饱年 运算( s a t u r a t i o n ) 和最值运算的操作符,所以程序员不得不使用条件分支语句来表达饱 和运算和最值运算。也可以使用嵌入式汇编来表达,但是这不利于程序的可移植性和可 读性。i n t e l 编译器能识别c c h 语言分支语句和f o r t r a n 语言分支语句表达的饱和运算和最 值运算 1 3 1 ,进行向量化用相应s l m d 指令来进行替换,消除了控制相关。考虑到p 4 处理 器基于n e t b u r s t 微体系架构,有很长的流水线,因此自动的饱, f i l l 最值运算的识别极大地提 4 十 u i 1 二= 1 l = i 州 = = 江 吐 o f ) 离了程序的性能。对其他语言表达的饱和和塌值运算的识别,其原理与a a r t 等人的文章的 说的方法也类似,f 表是用于饱和运算和最值运算的s i m d 指令。 i n s t r u c t i o n d e s c r i p t i o n p a d d s b p s u b s ba d d s u bs i g n e dp a c k e db y t e sf r o ms o u r c et od e s t i n a t i o na n ds a t u r a t e p a d d s w ip s u b s wa d d s u bs i g n e dp a c k e dw o r d sf r o ms o u r c et od e s t i n a t i o na n ds a t u r a t e p a d d u s b p s u b u s ba d d s u bu n s i g n e dp a c k e db y t e sf r o ms o u r c et od e s t i n a t i o na n ds a t u r a t e p a d d u s w p s u b u s wa d d s u bu n s i g n e dp a c k e dw o r d sf r o ms o u r c et od e s t i n a t i o na n ds a t u r a t e p m i n u b p m a x u b c o m p u t em i n i m a xo fu n s i g n e dp a c k e db y t e si ns o u r c ea n dd e s t i n a t i o n p m i n s w p m a x s w c o m p u t em i n i m a xo fs i g n e dp a c k e dw o r d si ns o u r c ea n dd e s t i n a t i o n 表1 饱和运算与最值运算的s i m d 指令 i n t e 编译器的中间语言提供了长达3 2 位精度的最值运算符,这为很好识别最值运算提供了 根好的条件。当编译器扫描代码的中间语言表示时发现i f 结构在实现最值运算,则将这个 i f 结构用最值运算符表示。饱和运算的识别则基于最值的识别,比如以下例子, m i n u ( x u 3 2 + u y u 3 2 2 5 5 u ) :s a t - a d d u 8 ( x u 3 2 ,y u 3 2 ) i fm ( x u 3 2 ,v u 8 ) a 十( y u 3 2 v u 8 ) m i n s ( x s 3 2 + s y s 3 2 2 5 5 ) :s a t - a d d u 8 ( x s 3 2 y s 3 2 i fm ( x s 3 2 ,v u 8 ) am ( y s 3 2 ,v u 8 ) m a x b ( x s 3 2 一s y s 3 2 ,0 ) :s a t - s u b u 8 ( x s 3 2 ,y s 3 2 ) i fm ( x s 3 2 v u 8 ) a 十( y s 3 2 ,v u 8 】 符台条件的最值运算可以很容易的被识别为饱和运算。这个方法简单却非常有效,为以后的 向赞化提供了很直的基础。 由于s s e s s e 2 s s e 3 区分了非对齐的内存访问指令利对齐的内存访问指令,i n t e l 编译 器会s i m d 内存访问指令的效率非常低,因此i n t e l 编译器实现了静态平动态的对齐优化 ( a l i g n m e n to p t i m i z a t i o n ) 。 f l o a ta 1 0 0 0j ,b 1 0 0 0j j f o r ( i = 2 j1 1 0 0 0 ;i + + a 【1 】= a 【1 + b 【i ; f l o a ta 【1 0 0 0 】,b 【1 0 0 0 j a 2j = a 2j+bc 2j j 4a 【3 】= a 【3 】+ b 【3 】; f o r ( i = 4 ji 1 0 0 0 ;i + + a 【1 = a 【i + b 【1j j 在上面的例子中,数组a 和数组b 的第一个元素是1 6 字节对齐的,i n t e l 编译器能据此分析 山在i 循环中,对a 数组的第一次访问并不是按照1 6 字节边界开始的。如果直接做向量化 的话,就必须使用非对齐方式的内存访问指令,这势必造成性能较低。在这种情况下,i n t e l 编泽器会去做静态的对齐优化,将原循环进行剥离,将代码变换为如右边所示,这样i 循环 就可以进行向量化并使用对齐的内存访问指令了。但是在一些情况下( 比如指针的使用) , 编泽器是无法通过静态的分析得到代码中所有内存访问的对齐信息,因此编译器必须要能够 处理每种可能的对齐情况。循环中的每个内存访问( 通常是数组形式) 都有两种对齐可能, 所以所有可能的对齐组合随着内存访问点的个数增加是以2 a n 的速度增跃的。这就要求编译 器在了代码人4 , n 试代码开销与循环性能两者间进行一个折中。在这种情况下,i n t e l 编译 器会使用动态循环剥离方法来作为折中的方案,对如下代码 f o r ( i - o ;i n # i + + ) d + - d x i 1 + d y 【i i n t e l 编译器将生成 p - d y 0 x o f j i f p ! = 0 ) s e r i a ld y n a m i cp e e l i n gl o o p ( a s s u m e sd y o x 0 3i sz e r o + p = ( 1 6 一p ) 4 j f o r ( i = o ji m i n ( p n ) ji + 十) d + 一d x ( i 】+ d y 【i 】j j i f ( ( ( d x + pj 0 x o f ) = = 0 ) + v e c t o rl o o pw i t hb o t hd xa n dd ya l i g n e d f o r ( i - p ji n i + + ) d + - d x i 】+ d y 【i 】j ) e l s e 【+ v e c t o rl o o pw i t hd ya l i g n e da n dd xu n a l i g n e d + f o r ( i1p ji 0 ;l e n 一一) + s t e p1 一g e tt h ed e l t av a l u e + i f ( b u f f e r s t e p ) d e l t a = i n p u 七b u f f e r o x f j ) e l s e ( i n p u t b u f f e r = + i n p + + ; d e l t a = ( i n p u t b u f f e r 4 ) o x f j 9 b u f f e r s t e p =! b u f f e r s t e p ; 通过阅读,我们可以很容易地发现变量b u f f e r s t e p 的值有一定的周期性。它的值在奇数次迭 代中的值为0 ,在偶数次迭代中的值为1 ,因此我们只要将循环体展开两次就可消除此控制 相关。 虽然我们通过肉眼就能识别出循环内的周期常量,但现有的编泽器来通常只能识别一般 常昔,弗能做一定的常量扩散。对于类似变量b u f f e r s t e p 、甚至更复杂、周期更长的周期性 常量,编译器都无法识别山来,无法消除不必要的控制相关。 3 、跨迭代数据相关的饱和运算 饱和运算被广泛运用于多媒体程序中,尤其是音频和图象处理程序。冈为在c 语言 里没有饱和运算操作符,所以程序员不得不使用已有的c 语言运算符来表达饱和运算。 比如在a d p c m 的a d p c m _ d e c o d e r 函数中,有如下含有饱和运算的代码片段: i f ( s i g n ) v a l p r e d 一= v p d i f f ; e l s e v a l p r e d + = v p d i f f ; 。s t e p5 一c l a m po u t p u tv a l u e 。 if(valpred32767) v a l p r e d = 3 2 7 6 7 ; e 1 s ei f ( v a l p r e d 一3 2 7 6 8 ) v a l p r e d = 一3 2 7 6 8 ; 在a d p c m 中的饱和运算和一般的饱和运算还有所区别,首先,变量v a l p r e d 足s h o r t 类型的,而变量v p d i f f 是u n s i g n e ds h o r t 类型的。其次,a d p c m 里的饱和运算是跨迭 代的,第i 次循环的v a l p r e d 的值是依赖于第i - 1 次循环的v a l d r e d 的值。所以虽然我 们能通过类似文献 1 3 中的算法能识别出这里的饱和运算,但由于跨迭代的数据相关, 编译器无法做到自动s i m d 优化。 4 、不连续的内存访问 在做s i m d 优化时,我们必须先把若干个操作数打包( p a c k ) 放入寄存器中,然后 再进行s i m d 运算同时对这些操作数进行运算。待运算结束后,还要把这些操作数再从 寄存器中分解( u n p a c k ) 开来。如果要打包的操作数在内存空间上是不连续的( 比如跳 跃式的内存访问) ,就需要首先把这些不连续的操作数存到到连续的内存空间里,然后 再打包、运算、最后解包。这样就给程序带来了额外的内存操作,必然会抵消掉一部分 s i m d 优化带来的好处,甚至把s i m d 带来的性能提升全部吞噬掉。 对于一个程序片段,如一个循环或者一个基木块,自动s i m d 优化编译器要能估算 进行s i m d 优化需要的代价和优化带来的好处,在额外的内存访问与s i m d 优化两者之 - 1 0 间进行平衡才有可能达到更好地提升应h 程序性能的效果。 同时,很多多媒体程序中都
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CRIA 17003.2-2024功能鞋 第2部分:防寒评价技术规范
- T/TMAC 163-2025新能源汽车电子后视镜技术要求
- T/GDAF 005-2022广东公共安全技术防范标准化试点管理规范
- T/CI 344-2024低温冷风微量润滑平面磨削加工工艺规范
- T/CAAMTB 94-2022汽车车窗玻璃用加速固化聚氨酯胶粘剂
- T/CPMIA 0107-2026注射成型车间智能制造执行系统 (MES)
- AI在体育教育中的应用
- 2025~2026学年安徽宣城市郎溪县人教版六年级下册期末数学试卷【附答案】
- 2025-2026学年吉林省舒兰市初中数学九年级期末下册自测模拟重点试题(附答案)
- PHP微信开发面试题及详细答案(实战版)
- 老年髋部骨折诊疗与管理指南2026年版
- 2026年重庆丰都县社区工作者招聘考试【结构化面试题库+高分答题模板】(含考官评分要点)
- 统编版九年级上册 道德与法治 第二单元《进入新时代》单元检测试卷(含答案)
- 2026新教材语文 7 培养德智体美劳全面发展的社会主义建设者和接班人 课件
- 2026江西九江长途汽车运输集团有限公司劳动合同制员工招聘4人考试模拟试题及答案解析
- 冷库工程监理实施细则
- 四上2-8《呵护我们的器官》教学课件
- 新生儿PICC置管与维护技术
- CSCO肾癌诊疗指南2026
- 2025四川简阳农商行社会招聘笔试历年典型考题及考点剖析附带答案详解
- 2014施工现场临时用电安全技术规范讲解(PPT)
评论
0/150
提交评论