游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1092|回复: 1

<求助>一个关于mmx的棘手问题

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2006-3-21 15:09:00 | 显示全部楼层 |阅读模式
小弟刚开始学习用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次的时间差来判断快慢。

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-3-22 08:42:00 | 显示全部楼层

Re:<求助>一个关于mmx的棘手问题

内嵌汇编不会。。呵呵,但是楼主切换用#ifdef等预编译不是更方便?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 23:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表