Können Sie eine inexakte Jacobi-Berechnung in Julia ohne spezielle Arrays parallelisieren?

8

In Julia wollten Sie eine ungenaue Jacobi basierend auf einer Vektorfunktion, f (x), berechnen, die viel Rechenleistung benötigt, um ausgewertet zu werden. Die Bewertung der Jacobi ist offensichtlich ziemlich klar im Konzept parallelisierbar. Meine Frage ist, kann dies in Julia ohne Rückgriff auf DistributedArray, SharedArray, etc. getan werden?

Angenommen, Sie haben den Code:

%Vor%

Ist es möglich, dies parallel zu machen, so wie Sie die Summe von 200000000 zufälligen Münzwürfen parallelisieren könnten, wie im Handbuch beschrieben? Das ist etwas, das zu

äquivalent ist %Vor%

Ich habe es versucht:

%Vor%

wobei "testfunc.jl" der Name der Datei ist, in der dieser Code und die Definition von f selbst gefunden wird. Als ich das versuchte, mit f einfach auswerten zu x. ^ 2 + cos (x), war ich in der Lage, eine richtige (diagonale) Matrix herauszuholen, aber die Werte stimmten nicht mit denen überein, die durch den nichtparallelen Code gegeben wurden kann bestätigen, dass sie die richtigen Werte haben). Weitere Untersuchungen legen nahe, dass der resultierende Jacobi einige Werte hat, die mit 2 oder 3 multipliziert werden, wenn julia -p 4 verwendet wird.

Ist der Ansatz, den ich beschrieben habe, plausibel (und erfordert lediglich eine Feinabstimmung, um Doppelungen zu vermeiden)? Wenn nicht, gibt es eine andere Methode, mit der ich die Jacobi ohne die Verwendung der komplizierteren speziellen Array-Typen auswerten kann?

Es scheint, dass das Hinzufügen von "J = Nullen (n, n)" als die erste Operation innerhalb der parallelen for-Schleife dieses Duplikationsproblem korrigiert. Kann dasselbe getan werden, ohne auf solch eine Brute-Force-Beseitigung des J-Arrays zurückzugreifen?

    
Glen O 22.04.2014, 04:43
quelle

1 Antwort

1

Was ich oben genannten Code verstehe, ist Folgendes: Wenn Sie schreiben:

%Vor%

Julia sendet eine Kopie von J an den neuen Prozess, wertet dann f(x) aus und addiert die Ergebnisse zusammen. Ich denke, der bessere und effizientere Weg besteht darin, das Senden von J zwischen Threads zu verhindern und Folgendes zu tun:

%Vor%

Mit dem obigen Code arbeitet jeder Thread auf einem neuen J und so liefert Summierung die richtige Antwort.

    
Reza Afzalan 10.10.2015 03:41
quelle