Date: Sun, 24 Dec 1995 12:48:06 +0100 From: Torbjorn Granlund <tege@matematik.su.se> To: freebsd-hackers@freebsd.org Subject: Better bzero Message-ID: <199512241148.MAA28761@insanus.matematik.su.se>
next in thread | raw e-mail | index | archive | help
Here is a bzero/memset that uses the same trick as the previously posted
memcpy.
noisy> gcc mzero.c zero.S src/lib/cputime.c -O -DSIZE=1000
noisy> a.out
zero 1005
memset 8436
bzero 8424
noisy> gcc mzero.c zero.S src/lib/cputime.c -O -DSIZE=10000
noisy> a.out
zero 5605
memset 8341
bzero 8349
Note that the code wins significantly even when the L1 cache is too small
for the data set. The mere 5x (actually 4.89x) improvement measured on my
system has been improved to a more decent 8x. :-)
.text
.align 4
.globl _zero
_zero: pushl %edi
movl 8(%esp),%edi /* destination pointer */
movl 12(%esp),%ecx /* size (in 32-bit words) */
xorl %eax,%eax /* for memset, we'd copy byte to all of eax */
shrl $3,%ecx /* count for unrolled loop */
jz Lend /* if zero, skip unrolled loop */
movl (%edi),%edx /* Fetch destination cache line */
.align 2,0x90 /* supply 0x90 for broken assemblers */
Loop: movl 28(%edi),%edx /* allocate cache line for destination */
nop /* we want these two insn to pair! */
movl %eax,(%edi) /* store words pairwise */
movl %eax,4(%edi)
movl %eax,8(%edi)
movl %eax,12(%edi)
movl %eax,16(%edi)
movl %eax,20(%edi)
movl %eax,24(%edi)
movl %eax,28(%edi)
addl $32,%edi /* update destination pointer */
decl %ecx /* decr loop count */
jnz Loop
/* Copy last 0-7 words */
Lend: movl 12(%esp),%ecx
andl $7,%ecx
cld
rep
stosl
popl %edi
ret
mzero.c:
#ifndef SIZE
#define SIZE 1000
#endif
#ifndef TIMES
#define TIMES 100000000/SIZE
#endif
long cputime ();
main ()
{
int d[SIZE];
int i;
long t0;
t0 = cputime ();
for (i = 0; i < TIMES; i++)
zero (d, SIZE);
printf ("zero %ld\n", cputime () - t0);
t0 = cputime ();
for (i = 0; i < TIMES; i++)
memset (d, 0, SIZE * sizeof (int));
printf ("memset %ld\n", cputime () - t0);
t0 = cputime ();
for (i = 0; i < TIMES; i++)
bzero (d, SIZE * sizeof (int));
printf ("bzero %ld\n", cputime () - t0);
exit (0);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512241148.MAA28761>
