2017-05-25 6 views
2

Ich schreibe ein Makro in Julia, die eine bestimmte Funktion zwischen vielen Prozessoren aufteilen kann. Ich habe folgende:Makro mit Funktion als Eingabe in Julia

macro parallel_calc(N::Int,proc::Int=4) 

     n=round(Int,N/proc); 

     proc_sum = @parallel (+) for i=1:proc 

      f(n) 

    end 

    return proc_sum/proc 

end 

Das Problem ist, ich das Makro schreiben will, so dass

@parallel_calc f(n) 

Und dann wird es in der Lage sein, den Job automatisch zwischen meinen Prozessoren aufgeteilt. Gibt es einen Weg in Julia, ein Makro zu schreiben, das eine Funktion als Eingabe nimmt? Ich habe versucht, online zu suchen, aber ich habe nichts gefunden, was helfen könnte. Ich habe auch versucht mit

@everywhere f(n) 

Nach dem Hinzufügen meiner Prozessoren, aber es läuft deutlich langsamer als das oben definierte Makro. Ich muss ein neues Makro definieren, das die Rechenlast gleichmäßig (oder fast gleich) auf meine verschiedenen Prozessoren aufteilt.

Antwort

2

Makros erhalten nur Ausdrücke als Eingaben und sollten nur Ausdrücke erzeugen. Der Ausdruck, der von einem Makro erzeugt wird, ist der Code, der tatsächlich so bewertet wird, als ob das ursprünglich geschrieben worden wäre. Es scheint, dass Sie konnte erreichen, was Sie mit einer Funktion zu schreiben, sind versucht, die die Funktion f als Argument, zum Beispiel nimmt:

function parallel_calc(f::Function, N::Int, proc::Int=4) 
    n = round(Int, N/proc) 
    proc_sum = @parallel (+) for i = 1:proc 
     f(n) 
    end 
    return proc_sum/proc 
end 

Das ist buchstäblich genau das, was Sie geschrieben haben, sondern als eine normale Funktion unter f als erstes Argument. Sie können dies dann wie folgt aufrufen:

parallel_calc(100) do n 
    # do something with `n` 
end 
Verwandte Themen