问个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 编辑 ] 有人对这个东西了解么? 我在测试 AsmMemZero0 函数的性能时发现,1# 的 AsmMemZero0 的函数有bug, 例如当要求对260个DWORD清零时,实际却对264个DWORD清零,请无心人 将bug改正,明天我将给出我写的4个清空函数 和AsmMemZero0 的性能对比。
by the way,无心人总是很忙,对自己写的程序很少有时间做测试。 :)
不是啊
是基本上
这个还没考虑测试
仅为了测试性能
==============
真不好意思
改好了 写大数库是个很麻烦的话,运行结果不直观,如果不做单元测试,很难保证正确性。
现在我写每一个函数,都要写测试代码,测试代码分两种,一种对其正确性进行测试,另一种对其速度进行测试。 :)
等你测试结果呢
最好能找到边界
我说过,边界可能稍微大于L2的尺寸
页:
[1]