amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > CPU Monitor [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

27.02.2006, 13:11 Uhr

bubblebobble
Posts: 707
Nutzer
Hallo !

Wie programmiert man einen CPUP Monitor, also z.B. eine CPU Auslastungsanzeige von 0-100% ?

Man kann einen "Cheat" Task benutzen, mit Priorität -128.
Der kommt dann nur zum Zuge, wenn sonst nichts anderes ansteht.
Aber: Was macht der Cheat Task ? Bisher zähle ich eine eine Schleife von 0...n hoch, und teste dann wie lange es gedauert hat. Als Referenz kann man die Schleife am Anfang einmal mit sehr hoehr Priorität oder sogar innterhalb forbid()/permit() laufen lassen, um zu wissen wie lange bei 0% CPU Auslastung einmal bis n Hochzählen dauert.

Leider ist das nicht sehr elegant. Gibt es eine bessere Methode ?


--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 13:59 Uhr

Holger
Posts: 8090
Nutzer
Zwei Methoden, die beide sehr viel Sorgfalt, Erfahrung und am besten Assemblerprogrammierung benötigen.
a) in der task-struct gibt es pointer auf routinen, die den task aktivieren und deaktivieren. Setzt man diese auf Routinen, die die aktuelle Zeit ermitteln, bevor sie die originalen aufrufen, weißt Du, wieviel Anteil an der realen Zeit für Dein Programm benötigt wurde. Dabei kann man innerhalb des lowpri-task die CPU in den HALT-Status setzen...

b) man richtet eine Routine für einen regelmäßig auftretenden interrupt ein, die den aktuellen task ermittelt. Dabei kann man nicht nur über den Anteil des lowpri-task die CPU-Last, sonern auch die CPU-Anteile der jeweiligen laufenden Tasks ermitteln. Auch hier sollte man innerhalb des lowpri-task die CPU in den HALT-Status setzen...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 16:22 Uhr

bubblebobble
Posts: 707
Nutzer
Das Problem dabei ist, dass die Anzeige für HD-Rec ist, und ich will nicht unnötig overhead verursachen. Ich weiss nicht ob das gut ist beim Taksswitching die Uhrzeit auszulesen, vor allem wenn es 68K Code ist auf PPC Systemen, und mit Interrupts will ich auch nicht arbeiten, es sollte möglichst überall laufen.

Was kann man von meinem obigen vorschlag halten ? Keine gute Idee?

Um die CPU nicht dauer zu belasten, ist die schleife ziemlich kur, und der CPU Task geht immer für 20ms schlafen, denn so oft braucht man ja den Wert nicht unbedingt.



--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 17:28 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von bubblebobble:
Das Problem dabei ist, dass die Anzeige für HD-Rec ist, und ich will nicht unnötig overhead verursachen. Ich weiss nicht ob das gut ist beim Taksswitching die Uhrzeit auszulesen, vor allem wenn es 68K Code ist auf PPC Systemen, und mit Interrupts will ich auch nicht arbeiten, es sollte möglichst überall laufen.

Na dann funktionieren die Funktionen für den task-switch wahrscheinlich sowieso nicht. Interrupts dagegen lassen sich, wenn sie systemkonform eingebunden werden vielleicht emulieren, weiß nicht, wie der Stand der Dinge ist.
Zitat:
Was kann man von meinem obigen vorschlag halten ? Keine gute Idee?
Zählschleifen sind nie eine gute Idee. Wie auch alles andere, das Zeit messen soll, aber Anzahl Instruktionen mißt. Je nachdem, ob der Teil im Cache ist oder nicht, liegen Welten zwischen den Ergebnissen, abgesehen von anderen unberücksichtigten Eigenheiten.
Zitat:
Um die CPU nicht dauer zu belasten, ist die schleife ziemlich kur, und der CPU Task geht immer für 20ms schlafen, denn so oft braucht man ja den Wert nicht unbedingt.
Das ist ja noch schlimmer. Woher willst Du wissen, ob und wieviele task-switches denn wirklich zwischen Deinen Wechseln zwischen Zählschleife und Wartepause liegen?
Abgesehen davon soll imho AOS4 eine eingebaute Funktion zum Ermitteln der CPU-Belastung haben, das wäre natürlich die sauberste Lösung.

Sollte AOS4 doch die task-switch Funktionen untersützen, wäre das für die Ermittlung der task-Performance, um die es Dir offenbar geht, die beste Lösung. Damit kannst Du ermitteln, wieviel Zeit *Dein* task benötigt hat, ganz ohne idle-task, etc...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 19:00 Uhr

bubblebobble
Posts: 707
Nutzer
Ich will eigentlich nicht die CPU Last von meinem Task, sondern von allen.
Das mit dem Hochzählen ist bisher aber am einfachsten und funktioniert ganz gut. Ein enger Loop ist eigentlich auch immer gleich schnell, weil er spätestens nach dem ersten Durchlauf im Cache ist. Mir ist auch egal wieviele Switches in der Pause passieren, das mittelt sich über die Zeit sowieso.

Die OS4 funktion will ich auch nicht benutzen, denn es soll ja überall laufen. Ich fürchte ich muss mit meiner Methode leben müssen.



--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 19:28 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von bubblebobble:
Das mit dem Hochzählen ist bisher aber am einfachsten und funktioniert ganz gut. Ein enger Loop ist eigentlich auch immer gleich schnell, weil er spätestens nach dem ersten Durchlauf im Cache ist.

...wobei dieser erste Durchlauf mit cache-miss dann genauso lange dauert, wie der gesamt Rest der Schleife bis zum Ende des integer-Zahlenbereiches.
Mann, Windows mußte bereits gepatcht werden, weil es aufgrund von Zählschleifen bei einer bestimmten Prozessorversion schon beim Booten abgestürzt ist, Linux hat exakt denselben Mist einmal durch, aber immer noch kommen schlaue Programmierer auf die Idee, daß man mit Zählschleifen ganz einfach "Benchmarken", "CPU-Last ermitteln" oder "Zeit messen" könne.
Kann man nicht.
Zitat:
Die OS4 funktion will ich auch nicht benutzen, denn es soll ja überall laufen.
Wird es nicht.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.02.2006, 22:16 Uhr

bubblebobble
Posts: 707
Nutzer
Bei HD-Rec hängt zum Glück nicht die Funktionalität davon ab, sondern es ist nur eine Anzeige. Aber es funktioniert relativ robust,
und wenns mal nicht ganz genau ist dann ist es auch nicht schlimm.

Ich verstehe schon, dass deine vorgeschlagenen Methoden eleganter sind, aber wenn es um minimalen Overhead geht und möglichst wenig Eingriff ins System, ist es etwas zu "gefährlich".

Trotzdem Danke für deine Vorschläge.
--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

28.02.2006, 01:32 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von bubblebobble:
Bei HD-Rec hängt zum Glück nicht die Funktionalität davon ab, sondern es ist nur eine Anzeige. Aber es funktioniert relativ robust,
und wenns mal nicht ganz genau ist dann ist es auch nicht schlimm.

Es verhält sich aber genau umgekehrt. Eine unwichtige Funktion in einem Programm, die mit diesem selbst gar nicht viel zu tun hat, verfälscht die Ergebnisse aller anderen Benchmark- und Profilingtools, weil es selbst CPU-Last erzeugt, die allerdings real ist, und z.B. Energiesparmodi möglicher zukünftiger Amigas oder heutiger UAE-Systeme (evtl. auch Amithlon) zunichte macht.
Für eine lustige Zahl zwischen 0 und 100, die wahrscheinlich eh falsch ist...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

28.02.2006, 10:31 Uhr

bubblebobble
Posts: 707
Nutzer
Damit es nicht 100% CPU Last gibt, wird nicht die ganze Zeit gemessen, sondern nur etwa 25% der Zeit, im Leerlauf hat man immerhin noch 75% IDLE.
Es verfälscht aber natürlich externe CPU Monitore, die die CPU Last messen wollen.
Die Anzeige funktioniert aber unter Amithlon sehr genau, unter WinUAE brauchbar (da gibts schnell mal 100%, weil Windows im Hintergrund was macht). Wie es bei MOS/OS4 ist weiss ich nicht. Interessant für den User ist die Anzeige aber, damit er weiss wie viele Stimmen oder Effekte er noch zur Verfügung hat.
Wer es trotzdem nicht mag, kann die CPU Anzeige abschalten.

Welche Methode würdest du denn in diesem Fall anwenden ?
Es soll unter Classic, Amithlon, WinUAE, OS4 und MOS laufen, etvl. in Zukunft mal unter AROS, und ich will nicht anfangen extra Würste zu braten für eines dieser Systeme.



--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

03.03.2006, 15:16 Uhr

bubblebobble
Posts: 707
Nutzer
Ich habe jetzt doch Extrwürste gebraten, bzw. Pasi hat das getan, und einen CPU Monitor für HD-Rec native für MOS geschrieben (in C). Für OS4 geht das wahrscheinlich ähnlich, indem man Statistiken auslesen kann. Gibt es freiwillige, die das für OS4 machen würden ?

Vermutlich muss nur 1 Zeile in etwa 200 Zeilen C Code geändert werden.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > CPU Monitor [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.