Taktfrequenz der CPU berechnen ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Kaeru Gaman hat geschrieben:
MVXA hat geschrieben:und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
:wink:
Ich schreib es ma so um:
Die APIs noch nicht von Fred für PB nativ aufrufbar inportiert hat.
Bild
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

@Laurin
Ich habe obigen Code erweitert und 'härtere Bandagen' aufgefahren. (API-calls und Realtime-Priority)
Klappt das nun ?
Ansonsten müßte ich passen.

Hast Du es denn auch mal mit 1 sec Testphasenzeit probiert ?
Vielleicht 'beschleunigt' deine CPU während des Tests, falls sie zuvor auf langsam eingestellt war, so dass man den Test über längere Zeit ausführen muss, oder besser noch, zweimal direkt nacheinander, und nur das zweite Ergebnis zählen.
Wer misst misst Mist. Erst recht wohl bei veränderbaren Taktraten.
!UD2
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Mit dem neuen Code Code zeigt er meist die aktuelle Taktrate an also 1 Ghz. Jedoch schwankt der Wert immernoch. Ich hatte nach mehreren Testläufen, 0,99 Ghz, 1,0-irgendwas und 1,7 Ghz. Ich habe es auch mit längeren Zeiten probiert (10 Sek.).

Wenn ich mir so einige Programme anschaue (zB DirectX-Kontrollprogramm), scheint es einen API-Befehl zu ermitteln der Taktrate zu geben. Da müsste man mal nachharken.
Wer misst misst Mist.
Hehe :wink:
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Bei mir ist dieser Code eigentlich sehr genau. Ich habe ein AMD athlon xp 2000+ (1,6666 GHz) und erkennen tut es 1,6558
Bild
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Du hast kein Cool'n'Quiet in deinem Chip. Wenn mein Prozessor kaum genutzt wird, taktet er sich auf 1 Ghz runter (Mutliplikator 5). Fährt er unter Vollast, taktet er mit 2,2 Ghz (Mutliplikator 11).

Das ist das Problem.

Wie gesagt, es gibt einige Programme, die trotz allem den maximalen Ghz-takt erkennen (DxDiag.exe).
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Vielleicht muss man einfach andersherum sich darüber freuen, dass der Code das so macht, denn er zeigt definitiv die Differenz des Prozessortaktzählers von 2 Zeitpunkten, die nahezu haargenau im angegebenen Abstand voneinander liegen, an. Wenn dann dxdiag sagt 5GHz, kannst Du mit diesem Code das Gegenteil herausfinden ;-)

Eine Alternative kenne ich nicht (heißt aber nix), aber zumindest steht in der CPUID keine Geschwindigkeit (außer die grobe Einteilung Pentium 1,2,3,4) drin, nur genauer Prozessortyp, etc.
!UD2
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Nee, die CPUID hilft da nicht. Ich glaube da stehen nur Name, Model, Stepping etc. und die Erweiterungen wie SEE drin.

Woher bekommt DxDiag seine Infos?


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Bei mir zeigt dxdiag die z.Z. tatsächliche Taktfrequenz (also auch wenn
QnQ aktiv ist) an; dann z.B. 1GHz. Dass dxdiag diesen Wert erst ermittelt
erkennt man auch daran, dass er mit zeitlicher Verzögerung angezeigt wird. Übertakte ich die Kiste, werden auch höhere Werte angezeigt. Alle
Werte decken sich sehr gut mit den Werten von Froggerproggers Pro-
gramm.
Eventuelle Abhilfe für zu ungenaue Angaben: In der Literatur wird für den
Einsatz von RDTSC empfohlen, ihn mit einem serialisierenden Befehl wie
z.B. CPUID zu "umhüllen". Beim Auslesen des TSC wird nicht auf gerade laufende Prozesse geachtet. CPUID davor stellt sicher, dass beim Aufruf
von RDTSC Ruhe in der Kiste ist. Wohlgemerkt, die Rückgabe-Werte von
CPUID interessieren hier überhaupt nicht!

Gruss
Helle
DarkCrow
Beiträge: 18
Registriert: 04.01.2005 16:35
Wohnort: Altrip
Kontaktdaten:

Beitrag von DarkCrow »

Also folgende Prozedur funktioniert auch bei meinem Freund ...

Code: Alles auswählen

Procedure.l CalcCPUSpeed()
  DelayTime = 500
  TimerHi = 0
  TimerLo = 0
PriorityClass = GetPriorityClass_(GetCurrentProcess_())
Priority = GetThreadPriority_(GetCurrentThread_())
SetPriorityClass_(GetCurrentProcess_(),100)
SetThreadPriority_(GetCurrentThread_(),15)

Sleep_(10)
  !CPUID
  !DW 310Fh    ; rdtsc
  MOV TimerLo, EAX
  MOV TimerHi, EDX
Sleep_(DelayTime)
  !CPUID
  !DW 310Fh
  SUB EAX, TimerLo
  SUB EDX, TimerHi
  MOV TimerLo, EAX
  MOV TimerHi, EDX

SetPriorityClass_(GetCurrentProcess_(),Priority)
SetThreadPriority_(GetCurrentThread_(),PriorityClass)
  ProcedureReturn (TimerLo / (1000.0 * DelayTime))
EndProcedure
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

@DarkCrow:
Ich bekomme bei deinem Code immer einen Fehler bei

Code: Alles auswählen

  MOV TimerLo, EAX
  MOV TimerHi, EDX 
Fehler: 'TimeLo' is not a valid Operator.

Weiß jemand den Grund?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Antworten