为什么不把它包含在你的函数定义中来打印这些信息呢?例如
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 post on info,以将多个参数提供给与map
and一起使用的函数pmap
。
Julia文档建议
pmap() 是为每个函数调用执行大量工作的情况而设计的。相比之下,@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
是一个艰巨的任务高手 - 从每个人的能力。