2016-06-27 11 views
2

Ich muss ein Ergebnis eines stochastischen Algorithmus mehrere Male berechnen. Am Ende möchte ich alle Ergebnisse in einem Array haben. Die Ausführungen des Algorithmus sind unabhängig voneinander.Optimieren parallel für Schleife Array in Julia zurück

@parallel (vcat) for i=1:10 
    rand() # or any other algorithm yielding a number 
end 

Aber es scheint ein wenig ineffizient, wenn ein Thread das Ergebnis von einem anderen Thread bekommt und die beiden Ergebnisse werden nach jeder Iteration des fusionierten für: In Julia kann diese for-Schleife wie dies leicht mit einem parallelen parallelisieren Schleife. Ist das korrekt? In diesem Fall könnte es sein, dass ein Thread ein Array mit 100 Elementen und ein anderes Array mit 200 Elementen und diese Arrays in einem Array mit 300 Elementen zusammengeführt werden. Könnte ich das irgendwie verhindern und den obigen Code umschreiben, um mehrfache Arrayzuweisungen zu verhindern und vielleicht das Ergebnis, das innerhalb der for-Schleife berechnet wird, in ein vorher zugewiesenes Array zu schreiben? Oder kann ich den Reduktionsoperator irgendwie schlauer machen?

Antwort

3

Sie könnten hierfür pmap verwenden. Er kann die Arbeit parallel auf Ihre Worker verteilen und dann die Ergebnisse jedes Jobs als separates Element in einem Array speichern. Sie können dieses Array dann am Ende kombinieren.

dieses Beispiel betrachten, wobei jeder Auftrag einen Zufallsvektor von unterschiedlicher Länge zu schaffen, von denen alle am Ende kombiniert:

addprocs(3) 

Results = pmap(rand, 1:10) 

Result = vcat(Results...) ## array of length 55. 

pmap wird so bald jeden Arbeiter einen Job zuweisen, wie es die Oberflächen Job, an dem gearbeitet wird. Als solche kann es effizienter sein als @parallel, wenn Ihre Aufträge von variabler Länge sind. (siehe here für Details).

Die ... Syntax unterbricht die Elemente von Results (d. H. Die 10 Vektoren unterschiedlicher Länge) in separate Argumente, die an die vcat-Funktion übergeben werden.

+1

Vielen Dank. Ich kannte "Pmap" nicht. Der Link zu Ihrer anderen Antwort war auch sehr hilfreich! – esel