无心人 发表于 2008-4-3 14:59:21

问个CPU指令的问题

做内存清零函数的优化
两个函数
一个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
        mov edx, t
        test edx, 0xFFFFFFFF
        je exit0
        test edi, 15//是否16字节对齐
        jeAsmZero1
    mov ecx, edi
        and ecx, 0xFFFFFFF0
        add ecx, 16
        sub ecx, edi//得到需要双字复制部分,要和edx比较谁大
         shr ecx, 2 //转换为双字长度
        mov ebx, ecx
        cmp ecx, edx
    jaAsmZero2//不足,转尾处理
AsmZero01:
        mov dword ptr , 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 , xmm0
        add edi, 16
        sub ecx, 1
        jne AsmZero11
AsmZero2:
        mov ecx, edx
        and ecx, 3//得到剩余的双字数
        je exit0
AsmZero3:
        mov dword ptr , 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
        mov edx, t
        test edx, 0xFFFFFFFF
        je exit0
        test edi, 15//是否16字节对齐
        jeAsmZero1
    mov ecx, edi
        and ecx, 0xFFFFFFF0
        add ecx, 16
        sub ecx, edi//得到需要双字复制部分,要和edx比较谁大
    shr ecx, 2 //转换为双字长度
        mov ebx, ecx
        cmp ecx, edx
    jaAsmZero2//不足,转尾处理
AsmZero01:
        mov dword ptr , 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 , xmm0
        add edi, 16
        sub ecx, 1
        jne AsmZero11
AsmZero2:
        mov ecx, edx
        and ecx, 3
        je exit0
AsmZero3:
        mov dword ptr , eax
        add edi, 4
        sub ecx, 1
        jne AsmZero3
exit0:
        sfence
        }
}

[ 本帖最后由 无心人 于 2008-5-6 07:55 编辑 ]

无心人 发表于 2008-4-3 19:59:21

有人对这个东西了解么?

liangbch 发表于 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

:)

不是啊
是基本上
这个还没考虑测试
仅为了测试性能
==============
真不好意思
改好了

liangbch 发表于 2008-5-6 10:35:00

写大数库是个很麻烦的话,运行结果不直观,如果不做单元测试,很难保证正确性。
现在我写每一个函数,都要写测试代码,测试代码分两种,一种对其正确性进行测试,另一种对其速度进行测试。

无心人 发表于 2008-5-6 17:24:19

:)

等你测试结果呢
最好能找到边界
我说过,边界可能稍微大于L2的尺寸
页: [1]
查看完整版本: 问个CPU指令的问题