Julia中嵌套循环的并行处理

3

我正在尝试为嵌套循环实现并行处理。但是,我遇到了以下的语法错误。

我正在修改这里的示例 (Julia中的并行计算 - 在多个核心上运行简单的for循环)

这个有效

for N in 1:5:20, H in 1:5:20
           println("The N of this iteration in $N, $H")
end

这会导致语法错误

using Distributed

@distributed for N in 1:5:20, H in 1:5:20
           println("The N of this iteration in $N, $H")
       end

enter image description here

2个回答

5
@distributed 宏仅支持对单个参数进行迭代。因此,您可以执行以下操作:
@distributed for (N,H) in collect(Iterators.product(1:5:20,1:5:20))
    println("The N of this iteration in $N, $H")
end

另一个选项是使用嵌套循环,此时只需要将其中一个循环标记为@distributed


我可以向@Przemyslaw Szufel提出一个后续问题吗?您说:“另一种选择当然是有一个嵌套循环。在这种情况下,只有一个循环应该是@distributed”。从技术上讲,我们是否可以将@distributed添加到两个循环中? - jgr
从技术上讲,你是可以这样做的。但这样做有什么意义呢?外层循环只是用来重新分配内部循环的。我敢打赌,这种处理模式也没有经过很好的测试。也许如果你有一些更复杂的分布式处理模式,你会考虑使用Dagger.jl吗? - Przemyslaw Szufel
是的,我同意。我希望在两个循环中添加一些内容可以更好地利用CPU。但我仍在努力理解计算机在这种情况下会做什么。 - jgr
CPU使用率问题的出现源于:(1)单个作业的进程饱和(2)作业时间的差异。基本上,(1)不能仅通过“Distributed”包解决,而(2)可能可以,但是当您仅坚持使用“Distributed”时,通常需要大量创意。但这是一个新问题的主题。 - Przemyslaw Szufel

2

对于单节点,多核并行化的另一种选择是使用多线程。由于开销较小且共享内存,因此通常更容易/更有效(请注意,Julia中没有像Python GIL那样的东西)。

相应的Julia命令为Threads.@threads(放在for循环前面)或Threads.@spawn用于产生要并行执行的任务。

编辑:添加了示例

Threads.@threads for (N,H) in collect(Iterators.product(1:5:20,1:5:20))
    println("The N of this iteration in $N, $H")
end

第二种情况:

f(x) = x^2
futures = [Threads.@spawn f(x) for x=1:10]
fetch.(futures)

1
你能否提供一个可复现的例子吗? - Soumya Boral
2
examples added above - lungben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接