Hallo zusammen.
Ich habe zwei Zeitgesteuerte Schleifen. Eine läuft mit 30ms und hoher Priorität und eine mit 0ms (ja es muss so schnell wie möglich sein
) und niedriger Priorität.
Es ist klar, dass ich bei der zweiten Schleife 100% Auslastung bekomme.
Ich habe eine Core i5 (2 Kerne mit jeweils 2 Threads = 4 Threads).
Momentan habe ich Hyperthreadting aktiv und folgende Einstellung:
Variante A)
Schleife 1 auf Thread 0
Schleife 2 auf Thread 2
Folglich habe ich jetzt immernoch 2 Thread die ich nicht benutze. Gibt es eine Möglichkeit, dass ich die eine Zeitschleife auf mehrere Threads teilen kann, also:
Variante B)
Schleife 1 auf Thread 0
Schleife 2 auf Thread 2 und 3
Oder ist es sinnvoller Hyperthreadting zu deaktvieren und jede Schleife auf einem Kernlaufen zu lassen? Also:
Variante C)
Schleife 1 auf Kern 0
Schleife 2 auf Kern 1
Warum nicht das Betriebssystem entscheiden lassen, welche Schleife auf welchem CPU läuft?
Das OS wäre dann auch in der Lage, auf beispielsweise nen Virenscanner zu reagieren etc...
Und ob die schnelle Schleife noch in mehrere threads aufgeteilt werden kann, musst du sehen, denn entweder es ist alles unteilbar voneinander abhängig, oder nicht. Aber wenn du diese frage stellst, schaue dir am besten erstmal nen paar theoretische Konzepte fürs Multithreading an, Stichwort Semaphoren etc.
MfG
Rene
in der schnellen schleife läuft eine zustandsmachine. da sind die schritte eher weniger teilbar.
Semaphore hab ich auch schon in betracht gezogen, aber die sind doch nur dazu da um doppelten speicherzugriffen vorzubeugen und deadlocks zu vermeiden, wie hilft mir das denn weiter?
Ich wollte halt nur das maximale aus der CPU rausholen, weil nur einer von vier Threads auf 100% steht und der Rest fast nix tut.
Vllt noch eine Frage, ist es dann doch lieber, wenn ich Hyperthreading abschalte? Ein Kern ist bestimmt (bei einer Schleifenabarbeitung) effizienter alls zwei Threads, oder sehe ich das falsch?
Warum probierst du es nicht einfach aus?
Naja, in beiden Fällen bekomm ich entweder 100% Threadauslastung oder 100% Kernauslastung.
Wie kann ich denn herausfinden, ob das eine, oder das andere schneller/besser ist?
Naja... wenn du nur die CPU auslasten willst, kannst du auch einfach ungebremste Whileschleifen laufen lassen
Was ist denn dein eigentliches Ziel, das du erreichen willst? Ich vermute mal möglichst viele Iterationen pro Sekunde deiner Statemachine. Damit hast du eine mögliche Messgröße, die du mit verschiedenen Konfigurationen beurteilen könntest.
ja genau.
Hab auch jetzt die Laufzeite ausgelesen. Mit Hyperthreadting sind die Werte wesentlich besser.
Ich denke, das liegt aber auch daran, dass ich im Bios nicht Hyperthreadting abschalten kann, sondern ich kann "multicore" abschalten. Dabei hab ich nicht wie gedacht meine 2 Kerne zur Verfügung, sondern nur noch einen. Da laufen jetzt beide Schleifen, klar, dass das langsamer ist.
Blödes Notebook Bios
Danke für eure Hilfen
(02.08.2011 08:17 )win98 schrieb: [ -> ]in der schnellen schleife läuft eine zustandsmachine. da sind die schritte eher weniger teilbar.
Semaphore hab ich auch schon in betracht gezogen, aber die sind doch nur dazu da um doppelten speicherzugriffen vorzubeugen und deadlocks zu vermeiden, wie hilft mir das denn weiter?
Wenn du dir die Prinzipien dahinter anschaust, wirst du ganz automatisch auf Probleme und Lösungen im Umgang mit parallelisierbarem Code stoßen, sodass du eine Vorstellung davon bekommst, wie du damit umgehen musst und was überhaupt parallelisierbar ist.
(02.08.2011 08:17 )win98 schrieb: [ -> ]Ich wollte halt nur das maximale aus der CPU rausholen, weil nur einer von vier Threads auf 100% steht und der Rest fast nix tut.
Vllt noch eine Frage, ist es dann doch lieber, wenn ich Hyperthreading abschalte? Ein Kern ist bestimmt (bei einer Schleifenabarbeitung) effizienter alls zwei Threads, oder sehe ich das falsch?
Lässt sich pauschal nicht sagen, da die Threads dazu da sind, um ungenutzte Einheiten während eines Taktes zu nutzen.
Beispielsweise braucht ein LOAD Befehl nicht die ALU und ein ADD braucht keinen Speicherzugriff (sofern die daten im Register stehen), sodass man die Befehle dekodieren und parallel auf dem gleichen Kern ausführen lassen kann.
Das ist allerdings stark vereinfacht dargestellt ^^ (Es gibt ja noch ne Pipeline etc).
Also theoretisch kann es schneller sein, praktisch laufen aber genausogut andere Programme auf deinem Rechner, die deine Ausführung ohne die threads komplett unterbrechen würden.
Also da hilft eigentlich nur ausprobieren.
Generell kann man sagen:
Kannst du alle virtuellen Kerne auslasten, ist es schneller diese auch zu nutzen. (Auch hier gibts natürlich Ausnahmen)