This is the result of a test that I did of the speed of the N64's RSP DMA
transfer. I got these results by starting a DMA with these different values
in the DMA length register, then measuring the time until the DMA busy flag
was turned off using the cop0 count register. This register increments at
1/2 CPU clock rate, so I doubled the value. As can be seen in the graph,
the rate is about 0.27 cycles per byte, or 3.7 bytes per cycle. I don't
have the code that I used for this test at my fingertips, but I'm sure that it
didn't impact this experiment too severely. It was based around a loop that
waited for the flag to be set. When length=0, the flag was set by the time
it was first tested, so the base value for the transfer time, 41 cycles,
is probably the loop overhead. Note that the value in length is 8 bytes less
than the actual length transferred, so there is actually some work done when
length=0.
The R2 value given, .9752, is a measure of the goodness of fit of
the line to the data. The closer this value is to one, the more closely a
straight line fits the data. (Since I took a statistics course I must say that
this is not said entirely right, but it doesn't matter). An R2 of
.9752 is close enough to conclude that there is a very high probability that
there is a direct linear relationship between the number of bytes you want
to transfer and the time it takes to do so.
Taking into account the fact that you can have one DMA queued while another
is executing, and that you can still run both the CPU and the RSP parallel
to the DMA, it is a very, very effective method of quickly moving data around.
Back to N64 Stuff
©2002 Halley's Comet Software