Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 May 1995 23:18:24 -0700 (PDT)
From:      Poul-Henning Kamp <phk@ref.tfs.com>
To:        tom@haven.uniserve.com (Tom Samplonius)
Cc:        gibbs@estienne.CS.Berkeley.EDU, hackers@FreeBSD.org
Subject:   Re: Adaptec 2940?
Message-ID:  <199505180618.XAA28462@ref.tfs.com>
In-Reply-To: <Pine.BSF.3.91.950517225856.9253A-100000@haven.uniserve.com> from "Tom Samplonius" at May 17, 95 11:02:45 pm

next in thread | previous in thread | raw e-mail | index | archive | help
> > The drivers are identical, so the interupt time should be the same for 
> > driving either card on the same machine.  Your benchmark is not really
> > valid since they were run on different motherboards.
> 
>   To some extent.  It is instesting that a good EISA system can best a 
> poor PCI system.  Woe to those buying cheap PCI motherboards.

Oh, it's much worse than that.  This is some numbers I have been collecting,
the represent the bandwidth between CPU and RAM pretty well:

First line is read dominated, second is write dominated:

My PC, en 486DX2/66 32Mb, FreeBSD-2.1, GCC 2.6.3
	flagmose# cc -o ram-speed -O2 ram-speed.c
	flagmose# ./ram-speed
	49005fb0   0.615 uS/op 1.63e+06 op/S  6.201 Mb/S
	8938c0df   0.159 uS/op 6.29e+06 op/S 23.981 Mb/S

A "IBM Valuepoint 486DX2/D PC", as above
	myname# cc -o ram-speed -O2 ram-speed.c
	myname# ./ram-speed
	49005fb0   0.377 uS/op 2.65e+06 op/S 10.116 Mb/S
	8938c0df   0.150 uS/op 6.66e+06 op/S 25.423 Mb/S

A ASUS P90 Neptune, FreeBSD-2.1, GCC 2.6.3
	phk@time.cdrom.com cc -o ram-speed -O2 ram-speed.c
	phk@time.cdrom.com ./ram-speed
	49005fb0   0.356 uS/op 2.81e+06 op/S 10.723 Mb/S
	8938c0df   0.209 uS/op 4.78e+06 op/S 18.235 Mb/S
	phk@time.cdrom.com uptime
	 4:12PM  up 4 days,  4:05, 4 users, load averages: 0.54, 0.27, 0.11
	Time wasn't idle, so these numbers are not 100% reliable

A Sun SS20/612, Solaris 2.4
	dgbcc6# cc -o ram-speed -fast ram-speed.c
	dgbcc6# ./ram-speed
	49005fb0   0.420 uS/op 2.38e+06 op/S  9.083 Mb/S
	8938c0df   0.448 uS/op 2.23e+06 op/S  8.507 Mb/S

A Sun SS1000/516, Solaris 2.4
	dgbmsu0# cc -o ram-speed -fast ram-speed.c
	dgbmsu0#  ./ram-speed
	49005fb0   0.771 uS/op 1.30e+06 op/S  4.950 Mb/S
	8938c0df   0.980 uS/op 1.02e+06 op/S  3.892 Mb/S

A RS6000/590, AIX 3.2.5
	# cc -o ram-speed -O3 ram-speed.c
	# ./ram-speed
	49005fb0   0.116 uS/op 8.61e+06 op/S 32.833 Mb/S
	8938c0df   0.177 uS/op 5.64e+06 op/S 21.532 Mb/S

Here is the source-code, Bruce and Rod use a different piece of code,
which is probably better, but this is what I have used all the time,
so I can compare my own results:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/time.h>

typedef unsigned long test_t;

#define TESTSIZE (8192*1024)
#define NOPS 1024*1024*16
#define NFACTOR 11
#define NVOL (NOPS*NFACTOR)

int
main(int argc,char **argv) 
{
    test_t *area, *chunk;
    test_t *pointer,x1=0,x2=0;
    unsigned counter,leap;
    int i;
    double delta;
    struct timeval before,middle,after;
    struct timezone tzb,tza;

    if (sizeof *area != 4) { perror("Need 32 bit test_t"); exit(2); }
    pointer = area=malloc(TESTSIZE);
    if(!area) { perror("malloc"); exit(2); }
    memset(area,'D',TESTSIZE);
    chunk = area + TESTSIZE / sizeof *area - 102;
    leap = TESTSIZE / sizeof *area - 204;

    gettimeofday(&before,&tzb);
    for(counter=0;counter<NOPS;counter++) {
#define ZAP(x)  x1 += *pointer;  pointer += x; 
	ZAP(1);  ZAP(2);  ZAP(3);  ZAP(5);  ZAP(7);
	ZAP(11); ZAP(13); ZAP(17); ZAP(19); ZAP(23);
	*pointer += x1;
#undef ZAP
	if(pointer >= chunk) { pointer -= leap; } 
	}
    gettimeofday(&middle,&tza);
    for(counter=0;counter<NOPS;counter++) {
#define ZAP(x)  *pointer = x2++ ;  pointer += x;
	ZAP(1);  ZAP(2);  ZAP(3);  ZAP(5);  ZAP(7);
	ZAP(11); ZAP(13); ZAP(17); ZAP(19); ZAP(23);
        x2 = *pointer;
#undef ZAP
	if(pointer >= chunk) { pointer -= leap; } 
	}
    gettimeofday(&after,&tza);

    if (x1 != 0x49005fb0) {perror("Wrong result"); exit(1); }

    if (x2 != 0x8938c0df) {perror("Wrong result"); exit(1); }

    delta  =middle.tv_sec - before.tv_sec;
    delta +=(middle.tv_usec - before.tv_usec)/1000000.0;
    printf("%08lx ",x1);
    printf(" %6.3f uS/op", delta*1000000.0/NVOL);
    printf(" %7.2e op/S", NVOL/delta);
    printf(" %6.3f Mb/S\n", (NVOL*sizeof *pointer/(1024.0*1024.0)) / delta);

    delta  =after.tv_sec - middle.tv_sec;
    delta +=(after.tv_usec - middle.tv_usec)/1000000.0;
    printf("%08lx ",x2);
    printf(" %6.3f uS/op", delta*1000000.0/NVOL);
    printf(" %7.2e op/S", NVOL/delta);
    printf(" %6.3f Mb/S\n", (NVOL*sizeof *pointer/(1024.0*1024.0)) / delta);

    return 0;
}
-- 
Poul-Henning Kamp <phk@login.dknet.dk> -- TRW Financial Systems, Inc.
'All relevant people are pertinent' && 'All rude people are impertinent'
=> 'no rude people are relevant'




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199505180618.XAA28462>