Julia 中的多线程与多处理

Rit*_*kar 5 multithreading multiprocessing julia

我是 Julia 的新手,对多处理和多线程几乎没有什么困惑。之前很多人在stackoverflow上问过类似的问题,但我还是有困惑。它们如下:

  1. 通过 @async 进行多线程处理,我们可以一次使用多个 cpu 核心吗?意味着我们可以通过在 Julia 中具有多个内核的机器上运行多线程程序来获得真正的并行处理吗?
  2. 如果第一个答案是肯定的,即我们在多线程中获得了多核或多 CPU 的优势。那么哪里需要Multiprocessing(用using Distributed)呢?
  3. 我在C++中使用过多线程,之前使用过STL线程库,谁能详细说明一下它的核心用法。它可以利用多核的优势吗?

Ant*_*llo 6

此高级概述可能会帮助您:

  • 多线程Threads模块)
    • 优点:创建时计算“便宜”(内存是共享的);
    • 缺点:受限于 CPU 内的核心数量,需要注意不要覆盖相同的内存或按预期顺序执行(“数据竞争”),我们无法在 Julia 中动态添加线程(从脚本内),但 Julia 必须以所需的固定数量的线程启动,通常是机器的核心数量;
  • 多进程Distributed模块):
    • 优点:数量不受限制,可以在同一台机器的不同CPU或集群的不同节点上运行,甚至在不同网络上使用SSH,我们可以在代码中添加进程addprocs(nToAdd)
    • 缺点:被复制的内存(每个进程都有自己的内存)在计算上是昂贵的(您需要获得比设置新进程的成本更高的收益)并且需要注意选择给定进程需要“带来哪些内存”与它”的功能。

除此之外,Julia 中还可能存在第三级并行化,更多的是在单核内的硬件级别,它利用现代 CPU 的 SIMD(单指令、多数据)特殊指令以及宏或@simd(来自LoopVectorisation.jl包)@turbo以及一些受支持的 GPU 提供的大规模并行性(仍然使用外部包,请参阅JuliaGPU)。

  • 很好的答案,但关于“@avx”的评论:首先,它已更名为“@turbo”,其次,它不是 Base Julia 的一部分,而是存在于外部包 LoopVectorization.jl 中。此外,还可以通过 GPU 或其他专用硬件来利用并行性。 (3认同)