lkml.org 
[lkml]   [2005]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [RFC][PATCH] Runtime switching of the idle function [take 2]
From
Date
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/

\
 
 \ /
  Last update: 2005-11-30 02:03    [W:0.073 / U:0.384 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site