Начальная загрузка с использованием @distributed в Julia - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу провести простую симуляцию Монте-Карло в Джастии. Просто начал изучать Джулию и обнаружил, что есть способ сделать вещи параллельно, используя @distributed. Поэтому я написал этот простой код, но, потратив средства, я действительно не мог понять, почему он не работает. Некоторая помощь действительно помогла бы мне выучить

using Random, RCall, StatsBase, HypothesisTests, Suppressor, Distributed, BenchmarkTools, Statistics
@everywhere using Random, RCall, StatsBase, HypothesisTests, Suppressor, Distributed, BenchmarkTools, Statistics; rmprocs(workers()); addprocs(4); nworkers()

function setup(n, B, nl, sl)

    take_counter = @distributed (+) for m in 1:nl
        Y = randn(n)
        mean_Y = mean(Y)

        counter = 0
        for i = 1:B
                Y_st = sample(Y, n, replace = true)
                mean_Y_st = mean(Y_st)  


                if mean_Y_st > mean_Y
                    counter += 1
                end
        end
        p_value = counter/B


        if p_value < sl  
            1
        else 
            0
        end
    end
    take_counter  

 end    

take_counter = setup(25, 200, 40, 0.05)

Если я запускаю, я получаю огромную ошибку, некоторая помощь может быть действительно полезной. Большое спасибо за помощь.

1 Ответ

0 голосов
/ 19 ноября 2018

Я не проверял ваш код подробно (в частности - я не проверял, рассчитывает ли он то, что вы хотите), а просто переписал его, чтобы сохранить то, что было необходимо для его запуска.

Этот код работаетдля меня:

using Distributed

rmprocs(workers()); addprocs(4); nworkers()

@everywhere using Statistics

function setup(n, B, nl, sl)
    @distributed (+) for m in 1:nl
        Y = randn(n)
        mean_Y = mean(Y)
        counter = 0
        for i = 1:B
                Y_st = rand(Y, n)
                mean_Y_st = mean(Y_st)  
                if mean_Y_st > mean_Y
                    counter += 1
                end
        end
        p_value = counter / B
        Int(p_value < sl)
    end
end

take_counter = setup(25, 200, 40, 0.05)

(это по сути идентично с небольшим количеством незначительных поворотов).Пожалуйста, дайте мне знать, работает ли он для вас или нет, чтобы мы могли диагностировать вашу проблему дальше.

РЕДАКТИРОВАТЬ: Теперь я просмотрел ваш код и вижу, в чем проблема.Сначала вы запускаете @everywhere, а затем удаляете и добавляете рабочих.Это означает, что на новых рабочих не работает @everywhere.Вы должны запустить @everywhere после добавления рабочих.

...