qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Re: [Qemu-devel] Timing problems


From: Sven Zenker
Subject: Re: Re: [Qemu-devel] Timing problems
Date: Tue, 30 Aug 2005 17:08:19 -0400

Hi,
> Hm..... hard choice.....correctness traded for perfomance.... But 
> anyway....IMHO this hack  is needed for every speed-step enabled 
> machine. Perhaps...the other workaround is via cpufreqd? I don't have 
> any Pentium M based PC/laptop around, so this is just a pure guess
Yeah, you can also expect problems with the original versions on
multi-processor machines, I would think. Would be nice to compare
performance of the patched and original version. Unfortunately can't do
that right now because timing of the non-patched version is of course
messed up on my machine.
> 
> BTW, your patch seems reversed....if you really mean you want to fetch 
> realtime clock, you should use "rdtsc", right? But the patch seems 
> replaced "rdtsc" with get_clock().... 
rdtsc gives you the cpu's clock count, which, if CPU frequency changes,
or your code is run on different processors (multiprocessor machine),
cannot be assumed to be related to real time anymore. Resolutionwise,
the real time clock may be inferior, of course, as Jim mentioned.
Jim: could you point me to this other patch? Thanks!
> 
> Another thing, IMHO it is better to use unified format (diff -u). More 
> readable and i think it is a standart
Here you go:
+++++++++++++++++++++++++++++++++++
qemu-0.7.1 # diff -u vl.c.org vl.c
--- vl.c.org    2005-08-26 19:03:52.000000000 -0400
+++ vl.c        2005-08-28 14:43:00.000000000 -0400
@@ -500,16 +500,11 @@
     } while (h != h1);
     return ((int64_t)h << 32) | l;
 }
-
 #elif defined(__i386__)
-
 int64_t cpu_get_real_ticks(void)
 {
-    int64_t val;
-    asm volatile ("rdtsc" : "=A" (val));
-    return val;
+    return get_clock();
 }
-
 #elif defined(__x86_64__)

 int64_t cpu_get_real_ticks(void)
@@ -591,18 +586,7 @@

 void cpu_calibrate_ticks(void)
 {
-    int64_t usec, ticks;
-
-    usec = get_clock();
-    ticks = cpu_get_real_ticks();
-#ifdef _WIN32
-    Sleep(50);
-#else
-    usleep(50 * 1000);
-#endif
-    usec = get_clock() - usec;
-    ticks = cpu_get_real_ticks() - ticks;
-    ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
+       ticks_per_sec = 1000000LL;  /* our real time clock resolution */
 }

 /* compute with 96 bit intermediate result: (a*b)/c */

+++++++++++++++++++++++++++++++++++

qemu-0.7.1/linux-user # diff -u main.c.org main.c
--- main.c.org  2005-08-28 14:40:16.000000000 -0400
+++ main.c      2005-08-28 15:06:31.000000000 -0400
@@ -110,9 +110,7 @@

 int64_t cpu_get_real_ticks(void)
 {
-    int64_t val;
-    asm volatile ("rdtsc" : "=A" (val));
-    return val;
+    return get_clock();
 }

 #elif defined(__x86_64__)

+++++++++++++++++++++++++++++++++++

Best regards,
Sven





reply via email to

[Prev in Thread] Current Thread [Next in Thread]