mam do czynienia z następującym problemem:Julia programowanie równoległe - Making istniejących funkcji dostępnych dla wszystkich pracowników
Mam funkcji o nazwie TrainModel że biegnie przez bardzo długi czas na jednym wątku. Po zakończeniu obliczeń zwraca funkcję jako argument wyjściowy, nazwijmy ją: f. Kiedy zapytać typ tego f, Julia wraca:
(generic function with 1 method)
(nie jestem pewien tego ostatniego kawałka informacji jest przydatny każdemu, kto czyta ten temat)
Teraz w drugim etapie I należy zastosować funkcję f na bardzo dużej tablicy wartości. To jest krok, który chciałbym przeprowadzić paralelizując. Po uruchomieniu Julii z wieloma procesami, np.
julia -p 4
idealnie, użyłbym:
pmap(f, my_values)
czy może:
aux = @parallel (hcat) for ii=1:100000000
f(my_values[ii])
end
Niestety, to nie zadziała. Julia twierdzi, że pracownicy nie są świadomi funkcji f, to mogę dostać messsage:
ERROR: function f not defined on process 2
Jak mogę funkcja f dostępne dla wszystkich pracowników? Oczywiście rozwiązanie „brudne” byłoby uruchomić czasochłonne funkcja TrainModel na wszystkich pracowników, jak to być może:
@everywhere f = TrainModel(...)
ale to byłoby marnotrawstwo cpu kiedy wszystko czego chcę to, że po prostu wynikiem f jest dostępny dla wszystkich pracowników.
Choć Szukałem postow z podobnymi problemami, jak dotąd nie mogę znaleźć odpowiedzi ...
Z góry dzięki! najlepszym
N.
Czy to jest problem? http://docs.julialang.org/en/release-0.3/manual/parallel-computing/#code-availability-and-loading-packages – Claies
Myślę, że to jest właśnie problem. Rozumiem, jak udostępnić funkcję wszystkim pracownikom, gdy funkcja jest zadeklarowana: na przykład można użyć makro @ wszędzie po zadeklarowaniu funkcji. Również dla zmiennych. Ale w jaki sposób zrobić to samo dla funkcji, które nie znajdują się w module lub zadeklarowane, ale zamiast tego są tworzone podczas wykonywania? – user1438310
To jest dobre pytanie i nie sądzę, aby pomocna była aplikacja OP do dokumentacji Julii. W rzeczywistości bardzo wyraźnie wynika z tego, że OP zapoznał się z odpowiednią sekcją w dokumentach i nie zajmuje się kwestią funkcji generowanych i przekazywanych między różnymi zakresami w czasie wykonywania. Ponadto istnieje dodatkowa uwaga: ponieważ funkcja jest generowana w czasie wykonywania, kompilator może nie być w stanie określić typu wyjściowego (tj. Nie będzie stabilny), co może powodować dodatkowe problemy (prawdopodobnie tylko wydajność związane z). –