PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zufallszahlen, Multithreading und Dual Cores


Arokh
2007-08-11, 23:56:44
Hi Leute,

Nachdem es mir endlich gelungen war, meinen neuen AMD X2 4200 erfolgreich in Dual Core Betrieb zu nehmen, wollte ich den direkt mal auf Herz und Nieren testen und gucken wie der sich in Multithreading-Umgebungen schlägt.
Dazu habe ich ein- und denselben Programmcode einmal in einem einzelnen Thread ablaufen lassen und einmal gleichzeitig in zwei paralell laufenden Threads. Auf einem Dual Core Prozessor sollte man erwarten, daß beide Lösungen gleich schnell sind (auf einem Single Core wäre die Zwei-Threads-Lösung nur halb so schnell, da doppelt so viel zu berechnen ist).
Entsetzt stellte ich aber fest, daß die Zwei-Threads-Lösung erheblich langsamer war und 3-4 mal so lange brauchte (also sogar noch länger als es bei einem Single Core zu erwarten wäre). Dies konnte ich sowohl unter Java als auch unter Delphi beobachten.

Nach einigem Testen fand ich heraus, woran es lag: am Zufallszahlengenerator! Mein Programmcode ruft mit hoher Frequenz den Zufallszahlengenerator auf (jeweils den in Java bzw. Delphi eingebauten), und als ich das mal spaßeshalber deaktiviert habe, waren Einzelthread- und Zweithread-Lösung plötzlich gleich schnell!
Jetzt frage ich mich wie das sein kann: was ist am Zufallszahlengenerator dran, das beim Multithreading so sehr bremst?
Man könnte vielleicht annehmen, daß der mit einer Threadsicherheit ausgestattet ist, so daß nicht zwei Threads gleichzeitig denselben Generator aufrufen können und daher aufeinander warten müssen. Das dürfte die Performance aber nur halbieren, und nicht dritteln oder vierteln wie bei mir geschehen.

Stone2001
2007-08-12, 00:19:00
Nach einigem Testen fand ich heraus, woran es lag: am Zufallszahlengenerator! Mein Programmcode ruft mit hoher Frequenz den Zufallszahlengenerator auf (jeweils den in Java bzw. Delphi eingebauten), und als ich das mal spaßeshalber deaktiviert habe, waren Einzelthread- und Zweithread-Lösung plötzlich gleich schnell!
Jetzt frage ich mich wie das sein kann: was ist am Zufallszahlengenerator dran, das beim Multithreading so sehr bremst?
Man könnte vielleicht annehmen, daß der mit einer Threadsicherheit ausgestattet ist, so daß nicht zwei Threads gleichzeitig denselben Generator aufrufen können und daher aufeinander warten müssen. Das dürfte die Performance aber nur halbieren, und nicht dritteln oder vierteln wie bei mir geschehen.
Herzlich Willkommen in der komplexen Welt des parallelen Programmierens.

Genau das gleiche Problem hatte ich auch schon mal. Bei mir war es allerdings C und Pthreads / OpenMP.
Dort war das Problem, dass die Funktion, welche die Zufallszahlen erstellt, nur von einem Thread aufgerufen werden kann, andere Threads, müssen dann halt warten. Es kann sein, dass sich die Threads, wenn sie kein Zugriff auf die entprechende Funktion haben, schlafen gelegt werden und dann erst wieder erweckt werden müssen, wenn die Funktion wieder verfügbar ist. Dadurch kommen eine Menge an Threadzustandwechseln hinzu, was die Performance gewaltig drücken kann.

ethrandil
2007-08-21, 03:00:20
In Java würde ich in diesem Fall dazu raten, für jeden Thread ein eigenes RAndom-Objekt zu erzeugen, aus welchem die Threads unabhängig voneinander Zufallszahlen ziehen können.

mfg
- eth