PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mikrosekunden pro TSC



7.e.Q
28-11-2005, 14:05
Hi Leute,

aufgrund des Tipps eines Kollegen hier benutze ich die folgende Funktion dazu, den TSC der CPU auszulesen:



static inline unsigned long long TSCRead(void)
{
unsigned long long xHilf;
__asm__ volatile( "rdtsc" : "=A" (xHilf) );
return xHilf;
}


Ich möchte nun gerne wissen, wie ich diesen Wert in Mikrosekunden Laufzeit umrechnen kann. Bisher mache ich das folgendermaßen (Pseudocode):



wert1 = TSCRead();
sleep(1); // Sekunde warten
wert2 = TSCRead();

diff = wert2 - wert1;
usec = diff / 1000000;


So weiß ich dann, um wieviele Zähler der TSC pro Mikrosekunde hochgezählt wird. Aber das Messen per sleep(1) nimmt halt eine Sekunde in Anspruch. Steht der Wert von TSC Zählern pro Mikrosekunde nicht vielleicht schon irgendwo im System?

EDIT: Okay, da es sich dabei ja um den Taktzähler handelt, erhöht sich der TSC in einer Mikrosekunde ziemlich genau um die Anzahl MHz der CPU. Logisch.

Jetzt weitere Fragen:
1. wie erhalte ich die genaue CPU Frequenz?
2. wie verhält es sich mit der Funktion auf HT/SMP Systemen?


Danke

Gruß,
Hendrik

Jasper
28-11-2005, 16:17
such mal nach PERFCTR oder PAPI (benutzt PERFCTR). sind beides libraries für das arbeiten mit solchen countern.


-j

7.e.Q
29-11-2005, 05:16
Leider ist es so, daß wir zum Übersetzen unserer Software einen Cygwin einsetzen, der einen GCC 2.95 nutzt und der inzwischen derart benutzerdefiniert angepasst wurde, daß ich ganz stark bezweifel, daß es noch möglich ist, irgendwelche zusätzlichen Bibliotheken darin zu integrieren. Ich muss also leider Gottes mit den Bordmitteln auskommen.

Danke trotzdem für den Hinweis. Die Libs kann ich, wenn schon nicht mit den Hauptprojekten, dann zumindes mit meiner eigenen Software verwenden.

Weitere Tips? Ich muss nur irgendwie an die Taktrate der CPU herankommen. Dann weiß ich, um wieviel Zähler sich der TSC pro Sekunde erhöht. Das auf Mikrosekunden runterzurechnen ist dann wohl das geringste Problem. :D

BlauerBlitz
29-11-2005, 14:44
Hallo!

Zu (1):
Die CPU-Frequenz steht in /proc/cpuinfo in einer Zeile, die beispielsweise wie folgt aussieht:



[...]
cpu MHz : 3000.152
[...]


Hier kannst du den Wert auslesen und weiterverwenden.
Die CPU-Frequenz in MHz sind die von dir gewünschten CPU-Takte je Mikro-Sekunde.

Zu (2):
Weiß ich leider nicht ...

Ciao
Werner

RapidMax
30-11-2005, 20:30
Zu (1):
Die CPU-Frequenz steht in /proc/cpuinfo in einer Zeile, die beispielsweise wie folgt aussieht:
Das währe am sinnvollsten, vorausgesetzt unter cygwin steht das auch in /proc/cpuinfo.... Ansonsten gibt es dafür möglicherweise eine WinAPI Funktion?

Ich habe mal in den Kernelsourcen nachgeschaut, wie linux auf diesen Wert kommt: Offenbar wird dieser anhand CTC (mach) oder des hpet counter ermittelt. Im Userspace würde ich das nicht machen, nur schon weil es port-Zugriff bedingt.

Zur Referenz:

arch/i386/kernel/timers/common.c
include/asm-i386/mach-default/mach_timer.h
include/asm-i386/timex.h

Gruss, Andy

7.e.Q
01-12-2005, 06:11
Es ist nicht nötig, daß das unterm Cygwin funktioniert. Die Software wird dort nur übersetzt, läuft nachher auf echten Linux Systemen. Von daher ist das mit dem Zugriff auf /proc kein Problem. Ich find's allerdings ein wenig umständlich. Naja, wenn's nur so geht, dann muss das wohl so... :rolleyes: