|
|
小弟刚开始学习用vc内嵌汇编使用mmx指令优化内存存取,遇到一个非常辣手的问题,希望高手能够帮我解决。
#include"windows.h"
#include<iostream>
using namespace std;
void fn16(unsigned char *mem1,unsigned char *mem2,unsigned long dwSize)
{
_asm
{
pushf
mov ecx,dwSize
mov esi,mem1
mov edi,mem2
///mmx优化部分//////////////////////////////////////////////
again2:
cmp ecx,16 //是否比16字节大
jl notbeggerthan16
movq mm0,[esi]
movq mm1,[esi+8]
movq [edi],mm0
movq [edi+8],mm1
add esi,16
add edi,16
sub ecx,16
jmp again2
notbeggerthan16:
cmp ecx,8
jl notbeggerthan8
movq mm0,[esi]
movq [edi],mm0
add esi,8
add edi,8
sub ecx,8
jmp notbeggerthan16
////////////非mmx优化部分/////////////////////////////////////////
notbeggerthan8:
start8:
cmp ecx,0
jz end
mov ax,[esi] //假设内存大小是16的倍数
add esi,2
mov [edi],ax
add edi,2
sub ecx,2
jmp start8
end:
emms
popf
}//end _asmsm
}
void main()
{
SYSTEMTIME st;
GetSystemTime(&st);
unsigned long timeBegin0=st.wSecond;
unsigned long timeBegin=st.wMilliseconds;
unsigned char *mem1=new unsigned char[2048*2000];
unsigned char *mem2=new unsigned char[2048*2000];
for (int i=0;i<=100;i++)
{
fn16(mem1,mem2,2048*2000);
}
GetSystemTime(&st);
unsigned long timeEnd0=st.wSecond;
unsigned long timeEnd=st.wMilliseconds;
unsigned long pass=(timeEnd0-timeBegin0)*1000+timeEnd-timeBegin;
cout<<pass;
}
以上程序负责把mem1中dwSize个字节的数据传入mem2。实验后发现:
当所传字节数在2048*500左右的时候,使用mmx后明显快近一倍的速度。而当dwSize>2048*2000的时候 却没有什么区别。不知道为何。
我对比的方法是:把“////优化部分///”和“//非优化部分///”之间的部分注释掉即为非优化的程序。通过看循环100次的时间差来判断快慢。
|
|