This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
time stamp counter in "make check"
- From: Dmitrieva Liubov <liubov dot dmitrieva at gmail dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 12 Jul 2012 18:58:36 +0400
- Subject: time stamp counter in "make check"
Hello All,
So at the moment in "make check" RDTSC instruction is used for
computation timing on x86, but this instruction produces misleading
results on out-of-order machines.
Especially dramatically it can be seen on Core i-7.
Examples:
>From string/test-memcpy.out
Length 21, alignment 0/21: -20 0 24
Length 21, alignment 21/21: -20 8 20
Length 22, alignment 0/ 0: 4 8 24
Length 22, alignment 22/ 0: -20 -20 28
Length 22, alignment 0/22: -20 0 28
...
>From string/test-strlen.out
Length 28, alignment 28/ 0: -20 -20 44
Length 28, alignment 0/28: -20 -20 44
Length 28, alignment 28/28: -20 0 40
Length 29, alignment 0/ 0: 0 4 44
Length 29, alignment 29/ 0: 16 0 48
Length 29, alignment 0/29: -20 4 48
Length 29, alignment 29/29: 0 -20 44
Length 30, alignment 0/ 0: 4 4 48
Almost in every test-<some string function>.out negative execution
time :) can be seen.
So, my proposal is to change from "rdtsc" instruction to "rdtscp"
instruction (which is a serializing variant of the RDTSC) if rdtscp
is available for target architecture.
This definitely solves the issue with negatives values.
All places with "rdtsc":
-bash-4.2$ grep -r "rdtsc" .
./sysdeps/x86_64/memusage.h: #define GETTIME(low,high) asm
("rdtscp" : "=a" (low), "=d" (high))
./sysdeps/x86_64/hp-timing.h: asm volatile ("rdtscp" : "=a"
(_lo), "=d" (_hi)); \
./sysdeps/i386/i686/memusage.h: #define GETTIME(low,high) asm
("rdtsc" : "=a" (low), "=d" (high))
./sysdeps/i386/i686/hp-timing.h: /* That's quite simple. Use the
`rdtsc' instruction. Note that the value
./sysdeps/i386/i686/hp-timing.h: 'cpuid' right before the `rdtsc'
instruciton. But we are not interested
./sysdeps/i386/i686/hp-timing.h: #define HP_TIMING_NOW(Var)
__asm__ __volatile__ ("rdtsc" : "=A" (Var))
./sysdeps/i386/i686/hp-timing.h: /* Use two 'rdtsc' instructions in
a row to find out how long it takes. */
./nptl/perf.c: #define HP_TIMING_NOW(Var) __asm__
__volatile__ ("rdtsc" : "=A" (Var))
./nptl/perf.c: asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \
./nptl/sockperf.c: #define HP_TIMING_NOW(Var) __asm__
__volatile__ ("rdtsc" : "=A" (Var))
--
Liubov Dmitrieva
Intel Corporation