并行运行地图切片



我使用mapslices()为某个数组的每一行应用相同的表达式:

function f(x)
...
end
a = rand(Normal(), 10000, 50)
b = mapslices(x -> f(x), a, dims = [2])

是否有一些优雅的方法可以使用所有CPU内核并行运行类似的过程?类似于在R中可以用future_apply()替换apply(),这样一切都会自动并行化。或者mapslices()在这里根本不合适,需要使用其他结构?

您可以在@distributed循环中编写此函数。

考虑代码

using Distributed
addprocs(4)
a=collect(reshape(1:12,3,4))

现在:

julia> @distributed (vcat) for col in 1:size(a,2)
sum(@view(a[:,col]))+1000*myid()
end
4-element Array{Int64,1}:
2006
3015
4024
5033

可以看出,第一列使用第一过程求和,第二列使用第二过程求和等等。

根据具体情况,您可能会考虑使用SharedArrays来存储数据。最后,您还可以查看Distributed包中的pmappreduce。根据具体情况,它们可能非常适合。

最新更新