Warum ist mein Programm schneller mit einem Kern, nicht mit zwei Kernen?

8

Ich versuche gerade zu verstehen, wie man parallel in Haskell programmiert. Ich folge der Arbeit "Ein Tutorial über parallele und gleichzeitige Programmierung in Haskell" von Simon Peyton Jones und Satnam Singh. Der Quellcode ist wie folgt:

%Vor%

Ich habe es mit dem folgenden Befehl kompiliert:

%Vor%

a) Lief es mit 1 Kern:

%Vor%

b) Lief es mit 2 Kern:

%Vor%

Der eine Kern lief jedoch 53,556 Sekunden. Wohingegen, der zwei Kern lief 73.401sek. Ich verstehe nicht, wie 2 Kerne tatsächlich langsamer als 1 Kern laufen können. Vielleicht ist die Übergabemeldung zu groß für dieses kleine Programm? Das Papier hat völlig andere Ergebnisse als Minen. Im Folgenden sind die Ausgabedaten.

Für 1 Kern:

%Vor%

Für 2 Kern:

%Vor%     
HHC 02.11.2012, 03:08
quelle

1 Antwort

7
%Vor%

Ich glaube, du meintest

%Vor%


Auf meiner Konfiguration (mit parSumFibEuler 45 8000 und mit nur einem Lauf):

  • Wenn N1 = 126.83s
  • Wenn N2 = 115.46s

Ich vermute, dass fib function viel mehr CPU verbraucht als sumEuler . Das würde die geringe Verbesserung von -N2 erklären. In Ihrer Situation wird es keinen Arbeitsraub geben.

Mit memoization wäre deine Fibonacci-Funktion viel besser, aber ich glaube nicht, dass du das versuchen wolltest.

EDIT: wie in den Kommentaren erwähnt, denke ich, dass Sie mit -N2 viele Unterbrechungen haben, da Sie zwei Kerne zur Verfügung haben.
Beispiel zu meiner Konfiguration (4 Kerne) mit sum $ parMap rdeepseq (fib) [1..40]

  • mit -N1 dauert es ~ 26s
  • mit -N2 dauert es ~ 16s
  • mit -N3 dauert es ~ 13s
  • mit -N4 dauert es ~ 30s (naja, das Haskell Programm ist hier nicht alleine)

Von hier :

  

Seien Sie vorsichtig, wenn Sie alle Prozessoren in Ihrem Computer verwenden: wenn einige von   Ihre Prozessoren werden von anderen Programmen verwendet, dies kann tatsächlich schaden   Leistung, anstatt sie zu verbessern.

    
Jerome 02.11.2012, 04:12
quelle