Unerwartetes Multithread-Ergebnis

8

Ich habe ein paar Java-Klassen geschrieben - SingleThreadedCompute und MultithreadedCompute -, um die Tatsache zu demonstrieren (oder was ich immer für eine Tatsache gehalten habe!), wenn Sie eine compute-zentrische (no I / O) -Aufgabe parallelisieren eine Single-Core-Maschine, erhalten Sie keine Beschleunigung. In der Tat ist mein Verständnis, dass die Parallelisierung solcher Aufgaben tatsächlich die Dinge verlangsamt, weil Sie jetzt mit dem Kontext-Switching-Overhead umgehen müssen. Nun, ich habe die Klassen ausgeführt und die parallele Version läuft unerwartet schneller: Die single-threaded Version läuft konsistent mit etwas mehr als 7 Sekunden auf meinem Rechner und die Multithread-Version läuft konstant mit etwas mehr als 6 Sekunden auf meinem Rechner. Kann mir jemand erklären, wie das möglich ist?

Hier sind die Klassen, wenn jemand schauen oder es für sich selbst ausprobieren möchte.

%Vor%

Hier ist die Multithread-Version:

%Vor%

Hier ist die Ausgabe der Single-Thread-Version:

%Vor%

Und hier ist die Ausgabe von der Multithread-Version:

%Vor%

BEARBEITEN: Informationen zur Umgebung:

  • Microsoft Windows XP Professional Version 2002, SP3
  • Dell Precision 670
  • Intel Xeon CPU 2,80 GHz, 1 MB L2-Cache

Ich bin mir nicht sicher, wie ich beweisen kann, dass es eine Single-Core-Maschine ist, abgesehen von der obigen Spezifikation und als ich die Maschine gekauft habe (August 2005), einzelne Cores waren der Standard und ich habe kein Upgrade auf Multicore (wenn das war sogar eine Option ... ich erinnere mich nicht). Wenn irgendwo in Windows kann ich überprüfen, dass andere als System-Eigenschaften (die oben genannten Informationen zeigt) lass es mich wissen und ich werde überprüfen.

Hier sind fünf aufeinanderfolgende ST- und MT-Läufe:

Fünf Singelrasen:

gesamt = 4999999999500000000 Verstrichene Zeit: 7000 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 7031 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6922 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6968 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6938 ms

FÜNF MULTITHERADED RUNS:

gesamt = 4999999999500000000 Verstrichene Zeit: 6047 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6141 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6063 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6282 ms

gesamt = 4999999999500000000 Verstrichene Zeit: 6125 ms

    
Willie Wheeler 06.02.2009, 04:24
quelle

6 Antworten

3

Ich habe versucht, den JIT auszuschalten, wie es Pax im obigen Kommentar vorgeschlagen hat. Pax, wenn Sie eine schnelle Antwort "Schalten Sie die JIT" posten möchten, werde ich Ihre Lösung gutschreiben.

Jedenfalls hat das JIT funktioniert (was bedeutet, dass es die tatsächlichen Ergebnisse in Übereinstimmung mit den erwarteten Ergebnissen gebracht hat). Ich musste von einer Milliarde zurückgehen, da es ewig dauerte, also ging ich mit 100 Millionen hin. Die Ergebnisse entsprechen viel mehr dem, was ich erwarten würde. Hier sind sie:

FÜNF NO-JIT EINFACHE LÄUFE

gesamt = 49999999950000000 Verstrichene Zeit: 17094 ms

gesamt = 49999999950000000 Verstrichene Zeit: 17109 ms

gesamt = 49999999950000000 Verstrichene Zeit: 17219 ms

gesamt = 49999999950000000 Verstrichene Zeit: 17375 ms

gesamt = 49999999950000000 Verstrichene Zeit: 17125 ms

FÜNF NO-JIT MULTITHERAPIERTE LÄUFE

gesamt = 49999999950000000 Verstrichene Zeit: 18719 ms

gesamt = 49999999950000000 Verstrichene Zeit: 18750 ms

gesamt = 49999999950000000 Verstrichene Zeit: 18610 ms

gesamt = 49999999950000000 Verstrichene Zeit: 18890 ms

gesamt = 49999999950000000 Verstrichene Zeit: 18719 ms

Danke Jungs für die Ideen und Hilfe.

    
Willie Wheeler 06.02.2009, 05:10
quelle
6

Es ist möglich, dass dies auf Hyper-Threading und / oder Pipelining zurückzuführen ist.

Aus Wikipedia auf Hyper-Threading :

  

Hyper-Threading ist eine Weiterentwicklung gegenüber Super-Threading. Hyper-Threading (offiziell als Hyper-Threading-Technologie oder HTT bezeichnet) ist eine Intel-proprietäre Technologie zur Verbesserung der Parallelisierung von Berechnungen (die mehrere Aufgaben gleichzeitig ausführen) auf PC-Mikroprozessoren. Ein Prozessor mit aktiviertem Hyper-Threading wird vom Betriebssystem als zwei Prozessoren anstelle von einem Prozessor behandelt. Dies bedeutet, dass nur ein Prozessor physisch vorhanden ist, das Betriebssystem jedoch zwei virtuelle Prozessoren sieht und die Arbeitslast zwischen ihnen teilt.

Aus Wikipedia über piplining :

  

Beim Rechnen ist eine Pipeline eine Reihe von Datenverarbeitungselementen, die in Reihe verbunden sind, so dass die Ausgabe eines Elements die Eingabe des nächsten ist. Die Elemente einer Pipeline werden oft parallel oder in zeitlicher Abfolge ausgeführt

    
Lawrence Dol 06.02.2009 04:39
quelle
3

Wie sieht der Rest Ihrer Umgebung aus? Ist das wiederholbar?

Zumindest in einer UNIX-Box wird ein lang laufender einzelner Prozess wahrscheinlich in der Priorität heruntergeregelt; Wenn Sie 10 Threads haben, erhält jeder seinen eigenen Teil der CPU und sammelt somit nicht so viel CPU-Zeit. Es wird dann nicht die Priorität der Schönfärberei verlieren. Insgesamt bekommt es einen größeren Gesamt-CPU-Anteil.

Hinzugefügt

Nur der Vollständigkeit halber ist dies, was Ihr Code auf einem Dual-Core-Mac mini unter OS / X 10.5.6

gibt %Vor%

Wie Sie sehen, laufen die Threads nicht notwendigerweise sequentiell ab, und die Laufzeit f der Multithreads beträgt etwa 56 Prozent des einzelnen Threads, was darauf hinweist, dass das Threading genutzt wird.

    
Charlie Martin 06.02.2009 04:31
quelle
1

Eine Zehntelsekunde Unterschied? Rauschen von der Startzeit (alleine) wird das überschwemmen. Schreibe etwas, das für ein oder zwei Minuten läuft.

    
paulmurray 06.02.2009 05:17
quelle
0

Ein Versuch, die Abweichung aufgrund von HotSpot zwischen dem Code zu eliminieren, der von Einzel- und Multithread-Varianten ausgeführt wird:

%Vor%

Dies läuft immer noch schneller als Multi in sequenziellen oder einzelnen (um etwa 10 Sekunden auf einem Eee PC 900 - 23 vs 13 Sekunden), obwohl sequentiell die gleichen Methoden wie multi die gleiche Anzahl von Malen ausgeführt wird.

    
Pete Kirkham 06.02.2009 09:48
quelle
0

Nur weil es Spaß macht ... das Ergebnis einer 8-Core-Server-Klasse-Maschine. AMD 2,7 GHz Shanghai cpus

%Vor%     
ReneS 06.02.2009 11:50
quelle