Julia 1.5中带有嵌套循环的并行分配操作

巴塔

这与以下帖子密切相关,Przemyslaw Szufel的回答很好。

如何在Julia中运行简单的并行数组分配操作?

假设我有一台40核的机器,我决定遵循Przemyslaw的建议,并使用@distributed而不是Threads来执行数组分配操作。这样可以很好地加快速度。

我的算法与上述用户情况的唯一细微差别是我有嵌套循环。当然,我总是可以向量化正在执行赋值操作的数组,但这会使我的代码复杂化。我是否应该在最外层循环之前简单地包含@sync @distributed,然后保留它?还是我需要在(在我的情况中)两个内部循环之前放置其他宏,以最大限度地提高并行化的好处?

Przemyslaw Szufel

如果是分布式循环,通常只希望并行化最外面的循环。为什么?因为分散了工作量,所以需要花费大量时间。

但是,在某些情况下,您可能需要搜索不同的并行化策略。

让我们考虑执行时间不平衡的情况。@distributed采取一种幼稚的方法,平均地划分了工作人员之间的循环。假设您有一个循环,例如:

for i in 1:100
    for j in 1:i
       ## do some heavy-lifting
    end
end

放在@distributed外部循环之前效率很低,因为所有并行执行都将等待最后一个块,其中j将处理所有最长的值这是一个典型的循环,其中并行化的值几乎不存在。在这种情况下,通常可以采用以下方法:

  • 惰性方法:在内部循环上并行化。如果i值的数量比核心数大几个数量级,那会很好
  • 有效的方法。创建一个代理变量k in 1:(100*(100+1)/2),分布于它,然后计算相应的值ij

最后,如果作业时间严重不平衡并且上述方法不起作用,则需要使用一些作业轮询机制。一种可行的方法是使用asyncmap生成远程任务,另一种可行的方法是使用外部工具-我通常bash为此使用一些简单的脚本-我在GitHub上发布了使用bash并行化作业的方法:https://github.com。 com / pszufe / KissCluster

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Julia中嵌套循环的并行处理

来自分类Dev

1元数组到Julia中的标量

来自分类Dev

Julia 1.1 x = x + 1 in for循环返回错误

来自分类Dev

在Julia中获取多维数组的1D子集

来自分类Dev

如何获取Julia中从1到n的数字列表?

来自分类Dev

在Julia中获取多维数组的1D子集

来自分类Dev

在Julia中并行执行行操作

来自分类Dev

在Julia中对数组进行并行操作

来自分类Dev

朱莉娅(Julia)中带有突变操作的for循环多线程

来自分类Dev

Julia中的内存分配

来自分类Dev

Julia中for循环的性能

来自分类Dev

Julia中的并行计算

来自分类Dev

Julia中的并行梯度计算

来自分类Dev

Julia 中的并行计算和错误分配的内核数量

来自分类Dev

在Julia中对大型常量数据结构进行并行操作

来自分类Dev

在Julia中为循环返回数组优化并行处理

来自分类Dev

在Julia中为循环返回数组优化并行处理

来自分类Dev

Julia中的嵌套列表推导

来自分类Dev

Julia MethodError: 没有方法匹配 take!(::Base.AbstractIOBuffer{Array{UInt8,1}})

来自分类Dev

Julia中的数组/列表操作

来自分类Dev

Julia中的数组/列表操作

来自分类Dev

Julia中nx1数组和n元素数组之间的区别

来自分类Dev

如何将Array {Float64,1}转换为julia中的float?

来自分类Dev

Julia中的FOR循环和范围

来自分类Dev

提高Julia中for循环的速度

来自分类Dev

在Julia中循环。语法混乱

来自分类Dev

有关Julia类型语法的问题:为什么Array {Int32,1} <:Array {Integer,1}为假?

来自分类Dev

拼写Julia中的字典

来自分类Dev

Julia:数组中的赋值