大数运算之内存操作篇
yaos 2004-07-24 11:53:36 // memfunc.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
unsigned long a[1048576];
unsigned long b[1048576];
//清零
void AsmMemZero(unsigned long * p, unsigned long t)
{
__asm
{
mov eax, dword ptr [p]
mov ecx, t
mov ebx, ecx
shr ebx, 3
mov edx, ebx
shl ebx, 3
sub ebx, ecx
cmp ebx, 0
jnz AsmMemZero0
mov ecx, edx
pxor mm0, mm0
movq mm2, mm0
pxor mm1, mm1
movq mm3, mm1
AsmMemZero1:
movntq [eax], mm0
movntq [eax + 8], mm1
movntq [eax + 16], mm2
movntq [eax + 24], mm3
add eax, 32
loop AsmMemZero1
AsmMemZero0:
cmp ebx, 0
je AsmMemZero3
mov ecx, ebx
mov ebx, 0
AsmMemZero2:
mov [eax], ebx
add eax, 4
loop AsmMemZero2
AsmMemZero3:
sfence
emms
}
}
void AsmMemCopy(unsigned long * pS, unsigned long * pD, unsigned long t)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long i;
for (i = 0; i < 1048576; i ++)
{
a[i] = 0xFFFFFFFF;
b[i] = 0xFFFFFFFF;
}
for (i = 0; i < 10000; i ++)
AsmMemZero(a, 1048576);
for (i = 0; i < 100000; i ++)
AsmMemCopy(a, b, 1048576);
return 0;
}
P4 XEON * 2 1024 MB内存 win2000 AS (SP4 +)
清零过程
for (i = 0; i < 10000; i ++)
AsmMemZero(a, 1048576);
23秒 大约1739 MB / s