Subject: More on MI kern_microtime.c - 64-bit arith & MIPS
To: None <tech-kern@netbsd.org>
From: Simon Burge <simonb@wasabisystems.com>
List: tech-kern
Date: 06/01/2003 02:33:26
I've had a play at using the MI microtime() in kern/kern_microtime.c
on evbmips (on a 396MHz Au1500 eval board), and using the cycle
counter for measuring the speed between the splclock()/splx() calls in
arch/evbmips/evbmips/clock.c and kern/kern_microtime.c I see that the
evbmips microtime takes about 1.4us and the MI microtime takes about
4.8us.
The current evbmips microtime (sbmips and sgimips should be similar)
gets by with a single multiply (see arch/mips/include/cpu.h around line
72 for info), while the MI microtime ends up with three multiplies and a
call to __divdi3. Changing the MI microtime to use 32-bit ints instead
of 64-bit ints gets back to a multiply and a divide (integer divides can
be _slow_ on a lot of MIPS cores), and back to 1.5us.
I think the only place we really need 64-bit arithmetic is in this
sequence in kern/kern_microtime.c:
int64_t usec;
usec = cpu_counter32() - ci->ci_cc_cc;
if (usec < 0)
usec += 0x100000000LL;
t.tv_usec += (usec * ci->ci_cc_ms_delta) / ci->ci_cc_denom;
Two things I'd like to be able to do:
1- Have a way of overriding the 64-bit integer currently used
(MICROTIME_CALC_TYPE or something less ugly). If this happened
to be a uint32_t and cpu_counter32() returns a uint32_t then we
also don't need the "if (usec < 0)" test either.
2- Have a way of overriding the
(usec * ci->ci_cc_ms_delta) / ci->ci_cc_denom
expression.
So, is the idea of trying to make microtime() faster worth chasing up
any more? If so, are the above ideas on the right track?
Simon.
--
Simon Burge <simonb@wasabisystems.com>
NetBSD Development, Support and Service: http://www.wasabisystems.com/