I wrote these programs to fill a vacuum.  Chris Brady's memtest-86 is
an excellent program for testing memory, but I wanted something that
would do stability testing for CPUs since I had decided to overclock
my pair of Celeron 366's on an Abit BP-6 motherboard.  No comments from
the peanut gallery. burnBX was added to test RAM & controller stability
  
Other than much vilified overclockers, other people may find these
programs useful.  System builders may wish to test their systems and
heatsinks.  PC buyers may wish to test their systems, particularly if
they have doubts about the builder's expertise.  Leaving out thermal
interface material (grease) on the heatsink is a likely flaw.

The usual advice is to run kernel compiles.  This is dangerous since a
crash will certainly corrupt the filesystem with all the files make -j 4
will have open.  Worse, I doubt that gcc has any significant FPU code.
Worse still, gcc is compiled with gcc, and I doubted that it would
produce highly optimized code.

Since I couldn't find anything, I decided to write it.

It's certain that Intel and other CPU manufacturers have devoted enormous
effort to CPU testing.  They have some programs for stability testing
and parts speed rating ("binning").  Some of these (HIPWR30.EXE) are
available to qualified Intel customers under NDA.

I wanted a program that would load the CPU to maximum.  Unintentionally,
code optimization does this.  I chose a base of FPU code (DDOT) since
I believed from 8087 days that the FPU consumes alot of current, and
was untested by gcc.  Then integer instructions were slipped into their
shadow to try to keep the other P6 ports loaded.  Agner Fog's excellent
article helped quite a bit.  Trial and much error.

I also tried to chose data (all-bits-lit) that would maximize power
consumption.  But I do not claim that my code is the most optimized
nor the most power consuming.  There could always be better.

Once I found lm-sensors, I could measure the results of my efforts.
Subject thermister vagaries, here are my results [revised]:

	29'C  at idle (hlt)
	41'   doing idle loop
	46'   mprime95  (as-is or reniced -19)	
	47'   make -j 4 on kernel
	47'   2 * burnP5    (estimated)
	47'   2 * burnBX  L (default, 4 MB)
	48'   2 * burnMMX L	
	48'   2 * burnK6    (estimated)
	50'   2 * burnMMX F (default, 64 kB in L2)	
	51'   2 * burnMMX D (16 kB, L1 cache)	
	51'   2 * burnP6    on zeroes for data
	52'   2 * burnP6    with FF's for data

All at 2 * 5.5 * 97 MHz (26'C ambient).  Higher and my CPU1 will lockup
under burnP6 in 5-10 min .  kernel compiles are stable to 99 MHz for
24 h.  But 98 MHz will give `burnBX` errors every 5-8 hours, and 95
MHz will give burnMMX D errors every ~6 hours, so now I run 94 MHz.
Errors seem to increase 10x for every 1 MHz.

I got tired of waiting for temperature steady-state so I measure current
instead.  Mostly I use the ATX power harness as a shunt, and measure
current by voltage drop.  Email for details.  This permits testng many
different instruction mix ideas quickly.  As it turns out, the orignal
burnP6 is close to the best I've found, needing only minor tweaking for
a 2% improvement.  The optimum burnK6 is also fairly similar, with just
minor architectural adjustments for AMD.

I also did some measurements with an inductive ammeter.  They gave 90% of
the estimated maximum datasheet current draw for burnP6.  So I'm fairly
happy with the code.  But suggestions for improvement are most welcome.
I don't claim this code is perfect, nor that it will catch all system
deficiencies.

BURNBX:  This program has been quite frustrating to develop.  It's hard to
measure the results.  I've finally hit on a reasonable pattern (walking
bit through carry, inverted every quadword except for cacheline leadoff)
that really brings out errors, and occasional lockups (more on FreeBSD).
The 82443BX only gets to 42'C.

Essentially, burnBX is a RAM tester, using whatever pages the OS allocates
to the process.  As such, it cannot test kernel RAM.  But it is designed
to be very intense, using the P6 optimized `rep movsd` instructions.
Please note that burnBX is _not_ optimal on AMD K6 based systems because
they don't have the optimized `rep mosvd` block move.

Beta testers have mostly reported quick error terminations. Their impact
should not be minimized, because such a data error could occur in kernel
code, causing system crashes.  The errors may be from the CPU/BX bus, in
which case ECC RAM will not help.   The cause is not perfectly clear, but
general case & 440BX cooling helps and so does an adequate powersupply.
300W is suggested.

Errors on my "instrumented" version of burnBX have not been isolated
to one memory cell but have been distributed across many addresses and
a few bits [only one at a time].  It is suspected that there is a bus
or transistor driver problem.  Or there may be undetected transients in
the 3.3 voltage.

REVISED BURNMMX:  I started this project as simply a way for AMD system
owners to check out their systems.  I was very surpised when my own
system started throwing errors with the MMX memory moves, and had to
downclock from 2 * 5.5 * 97 MHz to 94 MHz. It would seem that the simple
memory moves are more fragile (less robust to interrupts) than the 2%
higher bandwidth string moves.

BURNK7:  I finally bought an AMD Athlon and had to write a tester even
though I don't overclock it.  Writing burnK7 was much trial and error,
but the ammeter gave me immediate feedback on my efforts.  The powerful
K7 core was easy and fun to optimize.  I parallel pathed DDOT to remove a
dependancy, and could have gone much further, but current didn't increase,
so I stuffed in integer instructions which did increase current.  On my
850 Thunderbird, burnK7 draws 9% more power than burnK6.


Robert Redelmeier  redelm@ev1.net     June 15, 2001   

	


