Frage

der Code, den ich mit bin den Umgang hat Schleifen wie folgt aus:

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   

für kleine nt (10).

Nach dem Timing, es ist eigentlich 100-mal langsamer als die reguläre Schleife !!! Ich weiß, dass parfor können parallel Summen tun, so dass ich bin mir nicht sicher, warum dies nicht funktioniert.

Ich betreiben

matlabpool

mit den Out-of-the-box-Konfigurationen vor meinem Code ausgeführt wird.

Ich ist relativ neu in Matlab, und gerade damit begonnen, die parallel Funktionen zu benutzen, also bitte nicht davon ausgehen, dass ich nicht etwas tue dumm.

Danke!

PS:. Ich bin auf einem Quad-Core den Code ausgeführt wird, so würde ich erwarten, dass einige Verbesserungen sehen

War es hilfreich?

Lösung

machen die Partitionierung und Gruppieren der Ergebnisse (Overhead in der Arbeitsteilung und die Ergebnisse von den mehreren Fäden / Kerne Sammeln) hoch ist für kleine Werte von nt. Das ist normal, Sie würde nicht Partitionsdaten für einfache Aufgaben, die schnell in einer einfachen Schleife durchgeführt werden können.

Führen Sie immer etwas in der Schleife herausfordernd, dass der Partitionierungsaufwand wert ist. Hier ist ein schönes Einführung Programmierung parallel.

Die Fäden stammen aus einem Thread-Pool so der Aufwand für die Fäden zu schaffen nicht da sein sollte. Aber um die Teilergebnisse n Matrizen aus der bistar Größe zu erstellen, muss erstellt werden, werden alle Teilergebnisse berechnet und dann alle diese Teilergebnisse haben hinzugefügt werden (rekombinieren). In einer geraden Schleife, dann ist dies mit hohen Wahrscheinlichkeit an Ort und Stelle durchgeführt, keine Zuweisungen erfolgen.

Die vollständige Erklärung in der Hilfe (Danke für Ihren Link hierunter) ist:

Wenn die Zeit zu berechnen f, g und h groß , wird parfor deutlich schneller als die entsprechenden für Aussage, auch wenn n relativ ist klein.

So können Sie sie sehen, bedeutet genau das gleiche wie das, was ich meine, der Aufwand für kleine n Werte ist nur die Mühe wert, wenn, was Sie in der Schleife tun komplex / zeitraubend genug ist.

Andere Tipps

Parforcomes mit einem wenig Overhead. Wenn also nt wirklich klein ist, und wenn die Berechnung in der Schleife ist sehr schnell erledigt (wie eine Addition), ist die parfor Lösung langsamer. Außerdem, wenn Sie einen Quad-Core, Geschwindigkeitsgewinn wird in der Nähe sein, um linear für 1-3 Kerne parforon laufen, aber weniger, wenn Sie 4 Kerne verwenden, da auch der letzte Kernsystemprozess ausgeführt werden muss.

Zum Beispiel, wenn parfor kommt mit 100ms von Overhead und die Berechnung in der Schleife nimmt 5ms, und wenn wir das Geschwindigkeitsgewinn nehmen ist linear bis zu 4 Kerne mit einem Koeffizienten von 1 (dh mit 4 Kernen macht die Berechnung 4 mal schneller), muss nt etwa 30 sein, damit Sie einen Geschwindigkeitsgewinn mit parfor (150ms mit for, 132ms mit parfor) zu erreichen. Wenn Sie nur 10 Iterationen laufen sind, parfor wäre langsamer (50ms mit for, 112ms mit parfor).

Sie können den Aufwand auf Ihrem Rechner berechnen, indem die Ausführungszeit mit 1 Arbeiter vs 0 Arbeiter zu vergleichen, und Sie können mit 1 bis 4 Arbeiter, indem sie einen Liner fit durch die Ausführungszeiten Geschwindigkeitsverstärkung abzuschätzen. Dann wissen Sie, wenn es um die Verwendung parfor nützlich ist.

Neben der schlechten Leistung, da der Kommunikationsaufwand (andere Antworten sehen), gibt es einen anderen Grund, nicht zu verwenden parfor in diesem Fall. Alles, was in der parfor in diesem Fall getan wird verwendet Einbau-Multithreading . Unter der Annahme, alle Arbeiter auf dem gleichen PC laufen es keinen Vorteil, weil ein einziger Anruf bereits alle Kerne des Prozessors verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top