Messages in this thread | | | Subject | Re: [RFC][PATCH] Runtime switching of the idle function [take 2] | From | Lee Revell <> | Date | Tue, 29 Nov 2005 18:55:05 -0500 |
| |
On Tue, 2005-11-29 at 21:51 +0100, Andi Kleen wrote: > On Tue, Nov 29, 2005 at 03:35:39PM -0500, Lee Revell wrote: > > On Tue, 2005-11-29 at 20:53 +0100, Andi Kleen wrote: > > > We're mostly addressing it - there are problems left, but > > > overall it's looking good. The remaining problem is > > > an education issue of users to not use RDTSC directly, > > > but use gettimeofday/clock_gettime > > > > No the issue is to make gettimeofday fast enough that the people who > > currently have to use the TSC can use it. Right now it's 1500-3000 nsec > > or so, Vojtech mentioned that he has a patch that could reduce that to > > It's only that slow if the hardware can't do better. > > And the kernel makes it only slow when using RDTSC directly > is unsafe - so if you use it directly thinking the kernel cheats > you for your cycles you're just shoting yourself in the own foot. > > > 150-300 nsec. > > If you have capable hardware it can already do much better. >
But on my system gettimeofday uses the TSC and it's still ~35x slower than RDTSC:
rlrevell@mindpipe:~$ ./timetest rdtsc: 10000 calls in 1079 usecs gettimeofday: 10000 calls in 36628 usecs
#include <stdio.h> #include <stdlib.h> #include <sys/time.h>
typedef unsigned long long cycles_t;
#define rdtscll(val) \ __asm__ __volatile__("rdtsc" : "=A" (val))
static inline cycles_t get_cycles_tsc (void) { unsigned long long ret;
rdtscll(ret); return ret; }
static inline cycles_t get_cycles_gtod (void) { struct timeval tv; gettimeofday (&tv, NULL);
return tv.tv_usec; }
int main (void) { int i; cycles_t start_time; start_time= get_cycles_gtod(); for (i = 0; i < 10000; i++) { get_cycles_tsc(); } printf("rdtsc: %i calls in %llu usecs\n", i, get_cycles_gtod() - start_time); start_time = get_cycles_gtod(); for (i = 0; i < 10000; i++) { get_cycles_gtod(); } printf("gettimeofday: %i calls in %llu usecs\n", i, get_cycles_gtod() - start_time); return 0; }
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |