Julia中的并行计算-在多个内核上运行简单的for循环

SeS*_*esa 7 parallel-processing julia

首先,我不得不说我对并行计算是完全陌生的(并且对计算机科学几乎一无所知),因此我对“工人”或“过程”之类的东西的理解实际上是非常有限的。但是,我确实对运行一个简单的for循环存在疑问,该循环可能在并行迭代之间没有依赖性。

假设我想执行以下操作:

for N in 1:5:20
    println("The N of this iteration in $N")
end
Run Code Online (Sandbox Code Playgroud)

如果我只是希望这些消息出现在屏幕上,并且出现的顺序无关紧要,那么如何在Julia 0.6中实现这一目标,并在Julia 0.7(以及1.0)中作为将来的参考呢?

wue*_*eli 10

只是为了将示例添加到 Chris 的答案中。自 Julia 1.3 发布以来,您可以轻松地使用Threads.@threads

Threads.@threads for N in 1:5:20
    println("The number of this iteration is $N")
end
Run Code Online (Sandbox Code Playgroud)

在这里,您仅使用多个线程运行一个 julia 会话,而不是使用Distributed运行多个 julia 会话的位置。

有关更多信息,请参见例如多线程博客文章


Ale*_*207 9

分布式处理

julia -p 4如果您想使用 4 个 cpu(或使用函数addprocs(4)),请使用eg 启动 julia 。在 Julia 1.x 中,您可以按如下方式进行并行循环:

using Distributed
@distributed for N in 1:5:20
    println("The N of this iteration in $N")
end
Run Code Online (Sandbox Code Playgroud)

请注意,每个进程默认都有自己的变量。对于任何严肃的工作,请查看手册https://docs.julialang.org/en/v1.4/manual/parallel-computing/,特别是关于 SharedArrays 的部分。

分布式计算的另一个选择是函数pmap或包MPI.jl

线程

从 Julia 1.3 开始,您还可以使用 wueli 所述的线程。用 eg 启动 juliajulia -t 4以使用 4 个线程。或者,您可以或JULIA_NUM_THREADS在启动 julia 之前设置环境变量。例如 Linux/Mac 操作系统:

export JULIA_NUM_THREADS=4 
Run Code Online (Sandbox Code Playgroud)

在 Windows 中,您可以set JULIA_NUM_THREADS 4在 cmd 提示符下使用。

然后在茱莉亚:

   Threads.@threads for N = 1::20
       println("N = $N (thread $(Threads.threadid()) of out $(Threads.nthreads()))")
   end
Run Code Online (Sandbox Code Playgroud)

假设所有 CPU 都可以访问以上示例中的共享内存(例如“OpenMP 样式”并行性),这是多核 CPU 的常见情况。

  • SharedArrays 不应该用于过于严肃的工作,因为您想减少通信量,但在不需要最高性能的领域,它是一个很好的工具。`pmap` 和 `@parallel`/`@distributed` 都在不同的计算机之间分配工作:这只是在不同的计算机上设置进程并具有 SSH 连接的问题。最快的速度将来自`Threads.@threads`。如果您需要从线程打印,则需要使用“Core.print”。 (6认同)