再谈MMX优化

转载 2006年06月25日 20:28:00

这几天帮别人做了彩色空间转换的MMX优化,包括YUV420<->RGB,YUV420<->YUV422,UYVY->YUV420,感觉收获不少.MMX指令的确强劲,使用内联的MMX指令后转换速度比优化前平均提高了3-4倍.下面承接原来的MMX优化的入门篇稍微深入点讲解MMX指令的用法.

首先在VC的内联汇编中使用MMX指令的确时相当方便,而且效率也非常高.推荐使用.

一般有两种传送方式:数组和指针.使用数组比较方便,但使用指针更为普遍.
数组传送方式:
int a[6];
...
_asm{
movq mm0,[a];        //movq传送64位,mm0内容为:a[3]a[2]a[1]a[0]
movd mm1,[a+8];   //movd传送低32位,注意这个地方加8而不是4
}
指针传送方式:
int *p;
...
_asm{
mov eax,[p];
movq mm0,[eax];
movq mm1,[eax+8]
}

MMX中的加减使用就比较简单了,唯一值得注意的是有的是那些是带符号的运算,那些是带饱和的运算.
PMADDWD是两对16位数相乘然后再将32位的结果相加的运算.

MMX中乘法比较是分高低位的,因为要保证乘后的结果和乘数的位数一致,而且往往运算的结果都是高位为0,所以用低位乘法就够了.但是如果想得到一个完整的结果要算两次.
移动指令中要注意的是psllw,psrld等都是逻辑位移,是需要移动符号位的,只有psraw,psrad才是算术位移不移动符号位,MMX中没有除法运算,所以要想办法把被除数变换成2的N次方,然后在用psraw mm0,n来实现除法运算.注意移出的空位都用0填充.

MMX中最复杂就要属紧缩指令了.它们负责重新排列MMX寄存器中数,使之能够按照规定顺序输入输出数据.
packsswb mm0,mm1   // mm0中存放4个16位数:ABCD  mm1:EFGH packsswb后mm0:ABCDEFGH
packuswb 跟packsswb的唯一区别是就是不带符号位
punpckhbw 展开高阶紧缩数据 punpcklbw展开低阶紧缩数据
例如:mm0和mm1分别存放8个8位数.
mm0:A7,A6,A5,A4,A3,A2,A1,A0 mm1:B7,B6,B5,B4,B3,B2,B1,B0
punpckhbw mm0,mm1;    //结果  mm0:B7,A7,B6,A6,B5,A5,B4,A4
punpcklbw mm0,mm1;     //结果  mm0:B3,A3,B2,A2,B1,A1,B0,A0

下面具体举例:
比如src数组中存放着UYVYUYVY....的序列(Y,U,V为8位数),我们要把它按顺序转换成YYYYY,UUUU,VVVV进行存放
_asm{
movq            mm0,[src];        //mm0:Y3 V1 Y2 U1 Y1 V0 Y0 U0
movq            mm1,[src+8];     //mm1:Y7 V3 Y6 U3 Y5 V2 Y4 U2
movq            mm2,mm0;        //mm2做中转,mm0即将改变
punpcklbw    mm0,mm1;       //mm0:Y5 Y1 V2 V0 Y4 Y0 U2 U0
punpckhbw   mm2,mm1;       //mm2:Y7 Y3 V3 V1 Y6 Y2 U3 U1
movq            mm3,mm0;     
punpcklbw    mm0,mm2;       //mm0:Y6 Y4 Y2 Y0 U3 U2 U1 U0
movd            [U],mm0;         //传低32位的U
punpckhbw   mm3,mm2;      //mm3:Y7 Y5 Y3 Y1 V3 V2 V1 V0
movd            [V],mm3;        //传低32位的V
punpckhbw   mm0,mm3;     //mm0:Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
movq            [y],mm0;         //传8个Y
emms;                                 //凡是用MMX指令兄弟门别忘拉
}

相关文章推荐

使用MMX/SSE汇编指令集优化视频开发

1、汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年...

再谈存储过程的编写经验和优化措施、与人为本:优秀ASP.NET程序员的修炼之路

再谈存储过程的编写经验和优化措施存储过程的编写经验和优化措施:  ◆1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo...

再谈Yahoo关于性能优化的N条军规

本来这是个老生常谈的问题,上周自成又分享了一些性能优化的建议,我这里再做一个全面的Tips整理,谨作为查阅型的文档,不妥之处,还请指正; 如果你已经对yahoo这些优化建议烂熟于心,果断点这里 一...
  • e_wsq
  • e_wsq
  • 2012-02-12 04:58
  • 301

再谈数据库优化(database tuning)的真谛和误区

本文为作者最近几天看到论坛里的评论和群里的讨论,临时有感而发。目前性能问题确实越来越多和越来越迫切,而真正掌握的人也不是很多,因此,一些尚待商榷的观点和经验导出流传,对用户和初学者影响很大,本文结合平...

Pedro Vilaça:再谈OS X Rootkit

  • 2014-05-29 14:08
  • 4.77MB
  • 下载

雅虎再谈WEB前端网站优化

雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像)。 1.Minimize HTTP Requests 减少HT...

再谈企业ERP的修改

  • 2006-02-23 09:05
  • 38KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)