2016-05-11 25 views
-3

Ich habe eine Frage zu Multithreading (Parallelität) in Java. Tatsächlich realisiert ich zwei Programm eine Mandelbrot-Menge zu berechnen:Multithreading-Berechnungen in Java

  1. Die ersten Starts n Fäden und jeder Thread berechnet einen Teil der Höhe des Mandelbrot (Beispiel: https://www.logre.eu/mediawiki/images/4/49/Mandelbrot_h_block.png).

  2. Die zweite startet einen Pool von n Threads, wobei jeder Thread eine Zeile von Pixeln des Mandelbrot berechnet (Beispiel: https://www.logre.eu/mediawiki/images/f/f2/Mandelbrot_horizontal.png).

Ich habe unterschiedliche Profilierung auf zwei Kerne Maschine und ich verstehe nicht, warum das erste Programm ist schneller als die zweite, wenn die Anzahl der Threads (n) größer ist als die Anzahl der Kerne ist. Dies ist das Gegenteil, wenn die Anzahl der Threads niedriger ist als die Anzahl der Cores.

Kann mir jemand helfen?

Hinweis: Gibt es auch ein Limit für Threads, um dieses Programm zu berechnen?

+2

Dies fehlt alle erforderlichen Details. Ohne den Code zu sehen oder wie Sie ihn profiliert haben, wissen wir nicht, dass Sie das richtig und fair gemacht haben. Ohne die Zeiten zu sehen, wissen wir nicht, wie bedeutend der Unterschied ist. Wir wissen nicht einmal 'n'. – weston

Antwort

0

Sie vergleichen Äpfel und Orangen. Zwei verschiedene Implementierungen und sogar unterschiedliche Anzahl von Threads.

Sie sollten nicht mehr Threads verwenden als die CPU-Kerne Ihrer Maschine. Wenn n >> eine Anzahl von CPU-Kernen vorhanden ist, wird ein großer Teil der CPU-Nutzung dem Kontextwechsel zwischen Threads gewidmet sein.

1

Da Threads in einem Pool die gleiche Menge an Speicher wie einzelne Threads verbrauchen, hat dies den Vorteil, dass die ctx-Vermittlung aktiv ist und Thread-Pools aktive Threads erstellen/löschen. Wenn Sie viel mehr Threads als Kerne haben, um sie auszuführen, wird das Programm zu viel Zeit in Kontextwechsel verbringen.

Wenn Sie sagen, 1000 Threads auf einem 2-Kern (wie Sie gesagt haben) werden Sie zu viel Kontextwechsel haben und aus diesem Grund wird der Thread-Pool besser funktionieren.

Also ich denke, dass Sie nicht so viele Threads in beiden Fällen erstellen und der Unterschied ist nicht bemerkenswert.

Wenn der Unterschied bemerkenswert ist, können Sie versuchen, uns Ihren Code zu zeigen, um Ihnen weitere Informationen zu geben.

Überprüfen Sie die Anzahl der Threads, die Sie in einem anderen post berechnen können.

0

Ich glaube nicht, dass Sie keine Ansprüche über eine Anzahl von Threads kleiner machen sollten versuchen, oder größer ist als die Anzahl der Kerne, wenn Sie diese auf einer Dual-Core-Maschine nur testen, aus zwei Gründen

  • Erstens, mit nur 2 Kernen verwendet fast jedes Multithreading-System mehr Threads als Sie Kerne haben, so dass diese Metrik eher bedeutungslos wird.

  • Noch wichtiger, ohne Tests auf einer Maschine mit einer anderen Anzahl von Kernen, können Sie nicht wissen, ob es mehr oder weniger Threads als Kerne oder nur etwa mehr oder weniger als 2 Threads ist.

Damit haben Sie zwei völlig verschiedene Algorithmen verwendet.Es sieht so aus, als ob der eine mit mehr Threads besser skaliert als der andere und der Crossover-Punkt bei 2 Threads liegt. Ohne die Einzelheiten der Algorithmen zu kennen, können wir nichts darüber sagen, warum dies der Fall ist.