游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4844|回复: 18

MMX怎么比通用汇编慢?

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2007-9-25 10:01:00 | 显示全部楼层 |阅读模式
// 以下代码均不考虑对齐问题
int m_memcpy1( void * des, const void * src, int size )
{
        int cnt = size >> 3;
        _asm
        {
                push eax
                push ebx
                push esi
                push edi

                mov esi, src
                mov edi, des

                emms

                xor eax, eax
iloop_begin:
                cmp eax, cnt
                jz iloop_end

                movq mm0, [esi]
                movq [edi], mm0

                add esi, 8
                add edi, 8

                inc eax
                jmp iloop_begin
iloop_end:

                emms

                pop edi
                pop esi
                pop ebx
                pop eax
        }

        return 0;
}


int m_memcpy2( void * des, const void * src, int size )
{
        int cnt = size >> 2;
        int rcnt = size & 4;

        _asm
        {
                push eax
                push ebx
                push esi
                push edi

                mov esi, src
                mov edi, des

                xor eax, eax
jloop_begin:
                cmp eax, cnt
                jz jloop_end

                mov ebx, [esi]  // 就这里代码不同
                mov [edi], ebx  // 就这里代码不同

                add esi, 4
                add edi, 4

                inc eax

                jmp jloop_begin
jloop_end:

                pop edi
                pop esi
                pop ebx
                pop eax
        }

        return 0;
}

两者拷贝10000大小的内存10000次,不管怎么测试使用通用汇编的代码要比MMX快一倍,是我用的有问题吗?

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-25 10:19:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

减少循环次数,增加每次处理数据试试(mm0-mm7)

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-25 13:27:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

还是慢

增加到4个寄存器
                movq mm0, [esi + 00h]
                movq mm1, [esi + 08h]
                movq mm2, [esi + 10h]
                movq mm3, [esi + 18h]
                //movq mm4, [esi + 20h]
                //movq mm5, [esi + 28h]
                //movq mm6, [esi + 30h]
                //movq mm7, [esi + 38h]

                movq [edi + 00h], mm0
                movq [edi + 08h], mm1
                movq [edi + 10h], mm2
                movq [edi + 18h], mm3
                //movq [edi + 20h], mm4
                //movq [edi + 28h], mm5
                //movq [edi + 30h], mm6
                //movq [edi + 38h], mm7
50000次拷贝50000大小的内存

MMX循环1562次只相当于通用汇编循环12500次的一半

MMX耗时1800左右毫秒,通用汇编只消耗1100毫秒

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-25 13:29:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

难道Intel在双核CPU里做了手脚?MMX那还有什么用

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-25 13:41:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

你的计时器有问题?
50000次50000
mmx:2364738
normal:3287268

10000次10000
mmx:50654
normal:119829

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-25 13:50:00 | 显示全部楼层

Re: MMX怎么比通用汇编慢?

第一次测试
m_memcpy1为MMX,m_memcpy2为通用汇编
sf_200792513501.jpg

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-25 13:51:00 | 显示全部楼层

Re: MMX怎么比通用汇编慢?

第二次测试,交换运行顺序
m_memcpy1为MMX,m_memcpy2为通用汇编
sf_2007925135042.jpg

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-25 14:22:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

void * __cdecl memcpy (
        void * dst,
        const void * src,
        size_t count
        )
{
        void * ret = dst;

#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64)
        {
        extern void RtlMoveMemory( void *, const void *, size_t count );

        RtlMoveMemory( dst, src, count );
        }
#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64) */
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
        }
#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64) */

        return(ret);
}

内部调用RtlMoveMemory进行了优化,因该是在硬件层实现了内存复制所以会快很多.

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-25 15:15:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

试了下这样是最快的,可能是因为没对齐字节,要比memcpy慢一点点.
_asm   
{   
   push edi   
   push esi   
   push ecx   
   mov  esi,src   
   mov  ecx,count   
   mov  edi,dst   
   rep  movsb   
   pop  ecx   
   pop  esi   
   pop  edi   
}  

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-26 10:33:00 | 显示全部楼层

Re:MMX怎么比通用汇编慢?

MMX,就两个字形容,“过时”

64位双核已经普及,四核也出来了,MMX还干啥,32位800 * 600 alpha-blend简直就不能用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-21 05:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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