Taktfrequenz der CPU berechnen ...

Anfängerfragen zum Programmieren mit PureBasic.
DarkCrow
Beiträge: 18
Registriert: 04.01.2005 16:35
Wohnort: Altrip
Kontaktdaten:

Taktfrequenz der CPU berechnen ...

Beitrag von DarkCrow »

Hallo Leute,

da ich noch relativer PureBasic-Noob bin wollt ich fragen, was ihr bei diesem Code noch ändern würdet, damit er besser läuft ...

... bei mir läuft er, bei meinem Freund nicht :cry:

EDIT: So jetzt funktionierts mit dieser Prozedur :allright:

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
Zuletzt geändert von DarkCrow am 15.03.2005 20:51, insgesamt 1-mal geändert.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Ich kann dir zwar bei dem Problem nich helfen, aber ein kleiner Tipp: Die ganzen Api Befehle sind von PureBasic schon definiert. Du musst nur einen kleinen Bindestrich hintendrann setzen, also zum Beispiel: GetCurrentProcess_()
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
Bild
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag von brotkasten-deluxe »

es gibt doch ne lib wo dieser befehl drinne is .... oO nur ich weis grad nicht wo :oops:
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Genau das selbe hat doch irgendjemand hier schonmal in einer Prozedur gehabt. Nur weiß ich nichtmehr wer. Such mal ein wenig hier und im Archiv.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
DarkCrow
Beiträge: 18
Registriert: 04.01.2005 16:35
Wohnort: Altrip
Kontaktdaten:

Beitrag von DarkCrow »

MVXA hat geschrieben:und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
Also ich hab die gekaufte Version ... aber was sind die "APIs von Fred"?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

MVXA hat geschrieben:und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
:wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Hi!
...hab mich da jetzt auch mal rangesetzt und eine Procedure gebastelt:
(ist wieder mal ein gefundes Fressen, ASM zu vertiefen)

GetProcessorGHz(waitMs.l) liefert einen Float zurück, der die Geschwindigkeit der CPU in GHz wiedergibt. Dabei kann die Dauer des Tests eingestellt werden, "ein paar 100" ms sollten es aber schon sein, bei allem unter 100ms wird es bei mir zumindest sehr ungenau.

[edit] update auf 'härtere Bandagen' [/edit]

Code: Alles auswählen

; ghz.f = GetProcessorGHz(waitMs.l)
; returns to get the processors speed and uses waitMs Milliseconds
; for the calculation. (values >= 500 should give an accurate result)
; by Froggerprogger 12.03.05

Procedure.f GetProcessorGHz(waitMs.l)
  Protected Hi.l, Lo.l

  SetPriorityClass_(GetCurrentProcess_(),#REALTIME_PRIORITY_CLASS)  ; switching to realtime priority
  Sleep_(0)                     ; wait for new time-slice

  !RDTSC                        ; load the proc's timestamp to eax & edx
  !MOV [esp+8], eax             ; store eax to Lo
  !MOV [esp+4], edx             ; store edx to Hi

  Sleep_(waitMs)                ; wait for waitMs ms

  !RDTSC                        ; load the proc's timestamp to eax & edx
  !SUB eax, [esp+8]             ; subtract Lo from eax
  !SBB edx, [esp+4]             ; subtract Hi from edx incl. carrybit

  !MOV ecx, dword 1000          ; store 1000 to ecx
  !DIV ecx                      ; divide edx & eax by ecx and store result in eax

  !MOV [esp+8], eax             ; copy result to Lo

  SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS)  ; switching back to normal priority

  ProcedureReturn Lo / (1000.0 * waitMs)
EndProcedure

MessageRequester("","Processorspeed is " + StrF(GetProcessorGHz(1000), 4) + " GHz")
Zuletzt geändert von Froggerprogger am 12.03.2005 22:57, insgesamt 3-mal geändert.
!UD2
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

@Froggerprogger:
Dein Test ist sehr ungenau, was mein System angeht. Ich habe einen AMD mit Cool'n'Quite, da taket er im Leerlauf immer auf 1 Ghz runter und in Vollast auf 2,2 Ghz.
Dein Code zeigt immer ein Ergebnis zwischen 1,7 und 2 Ghz.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Antworten