On Fri, Sep 10, 2004 at 07:53:23PM +0200, Martin Eisfeld wrote:
Wenn ich das richtig verstehe, willst du die Taktfrewuenz in MHz berechnen. Folgender Code sollte es können:
include <stdio.h> #include <unistd.h>
#define rdtsc(X) asm volatile("rdtsc":"=A" (X))
wenn das das macht, was ich vermute, nämlich den TSC (time stamp counter) auslesen, dann geht das nur auf Prozessoren, die keine fortgeschrittenen Energiesparfunktionen (C3-States) kennen. Geht der Prozessor in C3, bleibt der TSC stehen.
Darum passiert hier z.B. folgendes: strolchi:~ # cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq 600000 strolchi:~ # powersave -r 235.674072 MHz strolchi:~ # cat /proc/acpi/processor/CPU0/power active state: C3 default state: C1 bus master activity: 00001000 states: C1: promotion[C2] demotion[--] latency[000] usage[12856040] C2: promotion[C3] demotion[C1] latency[050] usage[109088795] *C3: promotion[--] demotion[C2] latency[050] usage[97276603]
powersave -r macht ziemlich genau dasselbe, wie dein Programm.
Nun kann man das benutzen der C3-States zwar leider ziemlich einfach verhindern (einfach z.B. die Soundkarte benutzen oder eine USB-Maus anstecken), aber insgesamt bleibt es ein Hack.
Wobei die 10 sekündische Wartezeit (sleep(10);) wohl etwas sehr lang ist. ;-) Prinzipiell zählt das Programm einfach die Takte, die die Befehle zwischen rdtsc(start); und rdtsc(stop); brauchen.
Wie geschrieben, der TSC kann stehenbleiben.