Почему бы не просто включить его в определении вашей функции к печати эта информация? Например.
function f(n) #something that takes a huge amount of time
...
do stuff.
...
println("completed $n")
end
И, вы можете добавить дополнительный аргумент в вашу функцию, при желании, которая содержала бы, что 0.1
..., 0.9
в вашем примере (который я не совсем уверен, что те, но все они есть, они могут просто быть аргументом в вашей функции).
Если вы посмотрите на приведенный ниже пример на pmap
и @parallel
, вы найдете пример функции, переданной в pmap
, которая выводит результат.
Смотрите также this и this SO разместить на информацию для подачи нескольких аргументов для функций, используемых с map
и pmap
.
Джулия documentation советует
ртар() предназначен для случая, когда каждый вызов функции делает большой объем работы. Напротив, @parallel for может обрабатывать ситуации, когда каждая итерация крошечная, возможно, просто суммируя два числа.
Для этого есть несколько причин. Во-первых, pmap
берет на себя большие затраты на запуск рабочих мест. Таким образом, если задания очень малы, эти затраты на запуск могут стать неэффективными. Напротив, однако, pmap
выполняет «умную» работу по распределению рабочих мест среди работников. В частности, он создает очередь заданий и отправляет новое задание каждому работнику всякий раз, когда этот рабочий становится доступным. @parallel
, напротив, разворачивает всю работу, выполняемую среди рабочих, когда она называется. Таким образом, если некоторые работники занимают больше времени на своих рабочих местах, чем другие, вы можете столкнуться с ситуацией, когда большинство ваших работников закончили и простаивают, в то время как некоторые из них остаются активными в течение чрезмерного количества времени, заканчивая свою работу. Однако такая ситуация реже встречается с очень маленькими и простыми рабочими местами.
Ниже приведено следующее: предположим, что у нас есть два рабочих, один из которых медленный, а другой из них в два раза быстрее. В идеале мы хотели бы дать быструю рабочую работу в два раза больше работы, чем медленный рабочий. (или мы могли бы иметь быструю и медленную работу, но главное - то же самое). pmap
выполнит это, но @parallel
не будет.
Для каждого теста мы инициализируем следующее:
addprocs(2)
@everywhere begin
function parallel_func(idx)
workernum = myid() - 1
sleep(workernum)
println("job $idx")
end
end
Теперь для теста @parallel
, мы выполним следующее:
@parallel for idx = 1:12
parallel_func(idx)
end
И получить обратно вывода на печать:
julia> From worker 2: job 1
From worker 3: job 7
From worker 2: job 2
From worker 2: job 3
From worker 3: job 8
From worker 2: job 4
From worker 2: job 5
From worker 3: job 9
From worker 2: job 6
From worker 3: job 10
From worker 3: job 11
From worker 3: job 12
Это почти сладкое. Рабочие «разделили» работу равномерно. Обратите внимание, что каждый рабочий выполнил 6 заданий, хотя рабочий 2 в два раза быстрее, чем рабочий 3. Он может касаться, но он неэффективен.
Для для испытания pmap
, я бегу следующее:
pmap(parallel_func, 1:12)
и получить на выходе:
From worker 2: job 1
From worker 3: job 2
From worker 2: job 3
From worker 2: job 5
From worker 3: job 4
From worker 2: job 6
From worker 2: job 8
From worker 3: job 7
From worker 2: job 9
From worker 2: job 11
From worker 3: job 10
From worker 2: job 12
Теперь, обратите внимание, что работник 2 выполнил 8 рабочих мест и работник 3 выполнил 4 Это точно пропорционально их скорости и тому, что мы хотим для оптимальной эффективности. pmap
- это трудная задача мастера - от каждого в зависимости от их способности.
Непонятно, что вы подразумеваете под статусом. Приведите пример вывода, который вы хотите использовать для конкретного входного вектора. –
«статус» как в том, как далеко за счет оценки я отправил пример, чтобы уточнить – isebarn