Einzelnen Beitrag anzeigen

El.Blindo

Registriert seit: 24. Okt 2006
18 Beiträge
 
#7

Re: Taktfrequenz berechnen, Realtime Counter, Überlauf ?

  Alt 28. Jan 2008, 10:30
Erstmal, Sorry für den Bluescreen. Ist halt für Core Prozessoren.

Wobei, verstehen kann ich auch das nicht. Das Programm prüft erst ob die CPUID unterstützt wird, wenn nicht bricht es ab.
Wenn CPUID unterstützt wird, dann wird auf den Vendor geprüft, ist dieser nicht GENUEINTEL wird das Programm abgebrochen.
Beim AMD Duron sollte dort eigentlich AUTENTICAMD stehen.

Vielleicht liegt es am statischen Einbinden der DLL, wobei, das sollte eigentlich auch nix machen, das vor der Überprüfung auf den Prozzessor keine DLL Aufrufe erfolgen.

Wie dem auch sei, ich habe, um der Sache auf den Grund zu kommen:

1. Eure Tips beachtet, shl 32 müsste übrigens richtig sein, was bin ich für ein Depp.
2. Ich habe die Ausgaben im Memo erweitert.
3. Nun funktioniert es.

Ich habe nun folgendes gemacht:

Delphi-Quellcode:

type
  UInt64 = packed record
    Lo, Hi : DWord;
  end;
.
.
.
// Realtime Counter abfragen und merken
  Rdtsc(EAX,EDX);
  UInt64(T_Count).Lo := EAX;
  UInt64(T_Count).Hi := EDX;
  // IA32_APERF_MSR abfragen und merken
  Rdmsr(IA32_APERF_MSR,EAX,EDX);
  UInt64(A_Count).Lo := EAX;
  UInt64(A_Count).Hi := EDX;
  // IA32_MPERF_MSR abfragen und merken
  Rdmsr(IA32_MPERF_MSR,EAX,EDX);
  UInt64(M_Count).Lo := EAX;
  UInt64(M_Count).Hi := EDX;
  //Warten ohne CPU-Last, die Genauigkeit steigt mit steigender Wartezeit
  Sleep(250);
  // Performance Counter und Delta berechnen
  QueryPerformanceCounter(P_Delta);
  P_Delta := P_Delta-P_Count;
  // Realtime Counter abfragen und Delta berechnen
  Rdtsc(EAX,EDX);
  UInt64(T_Delta).Lo := EAX;
  UInt64(T_Delta).Hi := EDX;
  T_Delta := T_Delta-T_Count;
  // IA32_APERF_MSR abfragen und Delta berechnen
  Rdmsr(IA32_APERF_MSR,EAX,EDX);
  UInt64(A_Delta).Lo := EAX;
  UInt64(A_Delta).Hi := EDX;
  A_Delta := A_Delta - A_Count;
  // IA32_MPERF_MSR abfragen und Delta berechnen
  Rdmsr(IA32_MPERF_MSR,EAX,EDX);
  UInt64(M_Delta).Lo := EAX;
  UInt64(M_Delta).Hi := EDX;
  M_Delta := M_Delta - M_Count;
.
.
.
Die Ausgabe sieht nun so aus:

T_Delta : 499578708 T_Count : 443978902840440
M_Delta : 7999140 M_Count : 75242284529760
A_Delta : 3998292 A_Count : 47422740994605
P_Delta : 894070 P_Count : 794571775763
Nomineller Prozessortakt : 2000
Aktueller Prozessortakt : 1000

T_Delta : 499655388 T_Count : 443980903020900
M_Delta : 7133940 M_Count : 75242391276468
A_Delta : 3565674 A_Count : 47422794368151
P_Delta : 894208 P_Count : 794575355381
Nomineller Prozessortakt : 2000
Aktueller Prozessortakt : 1000

T_Delta : 499559364 T_Count : 443982903294864
M_Delta : 22331856 M_Count : 75242513536524
A_Delta : 11165232 A_Count : 47422855498137
P_Delta : 894036 P_Count : 794578935166
Nomineller Prozessortakt : 2000
Aktueller Prozessortakt : 1000

Danke für die Hilfe.
  Mit Zitat antworten Zitat