找回密码
 欢迎注册
查看: 5402|回复: 5

[求助] 问个CPU指令的问题

[复制链接]
发表于 2008-4-3 14:59:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
做内存清零函数的优化
两个函数
一个movdqa, 一个movntdq
数据尺寸(双字串长)小时第一个好,数据尺寸大时第二个好
在尺寸为135000-136000范围开始第二个函数表现开始好于一
(纳闷的是不是512k/4=131072)
二级缓存是512k 一级缓存是8k
请问如何切分分界点

//应该总假定是双字串
void AsmMemZero0(unsigned long * p, unsigned long t)
{
    __asm
    {
    xor eax, eax
        cld
        mov edi, dword ptr [p]
        mov edx, t
        test edx, 0xFFFFFFFF
        je exit0
        test edi, 15  //是否16字节对齐
        je  AsmZero1
    mov ecx, edi
        and ecx, 0xFFFFFFF0
        add ecx, 16
        sub ecx, edi  //得到需要双字复制部分,要和edx比较谁大
           shr ecx, 2 //转换为双字长度
        mov ebx, ecx
        cmp ecx, edx
    ja  AsmZero2  //不足,转尾处理
AsmZero01:
        mov dword ptr [edi], eax
        add edi, 4
        sub ecx, 1
        jne AsmZero01
    sub edx, ebx
        je exit0  //是否刚好
AsmZero1: //16字节对齐
        mov ecx, edx
        shr ecx, 2
        je AsmZero2  //是否不足16字节
    pxor xmm0, xmm0
AsmZero11:
        movdqa [edi], xmm0
        add edi, 16
        sub ecx, 1
        jne AsmZero11
AsmZero2:
        mov ecx, edx
        and ecx, 3  //得到剩余的双字数
        je exit0
AsmZero3:
        mov dword ptr [edi], eax
        add edi, 4
        sub ecx, 1
        jne AsmZero3
exit0:
        }
}

//应该总假定是双字串
void AsmMemZero1(unsigned long * p, unsigned long t)
{
    __asm
    {
    xor eax, eax
        cld
        mov edi, dword ptr [p]
        mov edx, t
        test edx, 0xFFFFFFFF
        je exit0
        test edi, 15  //是否16字节对齐
        je  AsmZero1
    mov ecx, edi
        and ecx, 0xFFFFFFF0
        add ecx, 16
        sub ecx, edi  //得到需要双字复制部分,要和edx比较谁大
    shr ecx, 2 //转换为双字长度
        mov ebx, ecx
        cmp ecx, edx
    ja  AsmZero2  //不足,转尾处理
AsmZero01:
        mov dword ptr [edi], eax
        add edi, 4
        sub ecx, 1
        jne AsmZero01
    sub edx, ebx
        je exit0  //是否刚好
AsmZero1: //16字节对齐
        mov ecx, edx
        shr ecx, 2
        je AsmZero2  //是否不足16字节
    pxor xmm0, xmm0
AsmZero11:
        movntdq [edi], xmm0
        add edi, 16
        sub ecx, 1
        jne AsmZero11
AsmZero2:
        mov ecx, edx
        and ecx, 3
        je exit0
AsmZero3:
        mov dword ptr [edi], eax
        add edi, 4
        sub ecx, 1
        jne AsmZero3
exit0:
        sfence
        }
}

[ 本帖最后由 无心人 于 2008-5-6 07:55 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-3 19:59:21 | 显示全部楼层
有人对这个东西了解么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-5 22:03:20 | 显示全部楼层
我在测试 AsmMemZero0 函数的性能时发现,1# 的 AsmMemZero0 的函数有bug, 例如当要求对260个DWORD清零时,实际却对264个DWORD清零,请无心人 将bug改正,明天我将给出我写的4个清空函数 和  AsmMemZero0 的性能对比。
  by the way,无心人总是很忙,对自己写的程序很少有时间做测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-6 07:55:23 | 显示全部楼层


不是啊
是基本上
这个还没考虑测试
仅为了测试性能
==============
真不好意思
改好了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-6 10:35:00 | 显示全部楼层
写大数库是个很麻烦的话,运行结果不直观,如果不做单元测试,很难保证正确性。
现在我写每一个函数,都要写测试代码,测试代码分两种,一种对其正确性进行测试,另一种对其速度进行测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-6 17:24:19 | 显示全部楼层


等你测试结果呢
最好能找到边界
我说过,边界可能稍微大于L2的尺寸
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-19 16:11 , Processed in 0.044498 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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