(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)