Julia 中的并行性和共享内存?

问题描述 投票:0回答:1

我已经阅读了并行计算文档并尝试了自己的一些示例,但我仍然对 Julia 中并行编程的基础知识有一些疑问:

  1. 如果我想在 4 核 PC 上使用 @parallel 宏,我可以添加到环境中的处理器数量是否有“上限”?我知道我们可以添加比核心数量更多的工作线程,并且由调度程序将进程分配给某个核心,但是分配给核心的进程数量的逻辑限制是多少?

  2. 按照 (1) 中描述的设置,如果我有一个数组将保存一些计算值,并且我在不同的工作进程上并行化每行的计算,这将是 SharedArrayDistributedArray 的示例?我的代码看起来像这样:

using Distributed
@everywhere function parareal(a, b, nC, nF, K, y0, f, coarseSolver, fineSolver)
      fine_solve = zeros(nC,nF+1,K);
      @sync for i=1:nC
           fine_solve[i,1,k] = correctC[i,k-1];
           for j = 2:(nF + 1)
              @spawn fine_solve[i, j, k] = fiPEvaled(xF[i, j - 1], fine_solve[i, j - 1, k])
           end
      end
end

据我了解,SharedArray 允许所有进程访问相同的内存区域,这就是我定义数组的方式?

我对 Julia 中的并行计算比较陌生,所以我对模糊的描述表示歉意。

parallel-processing julia
1个回答
0
投票

为了回答您的第一个问题,Julia 使用调度程序将工作线程分配给可用的处理核心。每个核心的工作线程没有逻辑限制,但是如果有许多线程等待核心时间,执行可能会比在较少线程之间循环慢。 Julia 版本之间的调度程序发生了变化,因此在 Julia 版本 1.0 和当前 Julia 之间,在线程数量超过核心的情况下哪个核心获取哪个线程已经发生了变化。有关当前详细信息,请参阅 https://docs.julialang.org/en/v1/base/multi-threading/

回答你的第二个问题,共享(或分布式)数组是由多个进程访问的数组。这将包括在创建线程之前定义的数组。 @everywhere 允许定义为 @everywhere 的代码在所有进程共享的上下文中仅执行一次,因此使用 @everywhere 定义的数组的处理方式与在线程创建之前为所有线程定义的数组类似(尽管 @everywhere 可能会发生竞争)在线程创建之前完全运行的代码中不会发生的所有初始化)。

作为所有这些的示例:

using Distributed

@assert Threads.nthreads() > 4 # we want enough threads for simultaneity

const globalarr = falses(4)

@sync for i in 1:4
    @async begin
        @everywhere earr1 = falses(4)
        localarr = falses(4)
        globalarr[i], localarr[i] = true, true
        sleep(rand())
        @everywhere earr2 = falses(4)
        earr1[i], earr2[i] = true, true
        @show i, globalarr, earr1, earr2, localarr
    end
end

globalarr
的行为符合预期。每个线程将其第
i
位更改为 true。
localarr
显示每个线程都会修改自己的
localarr
副本。定义为
earr1
earr2
@everywhere
位集会遭受竞争条件错误,这取决于哪个线程首先到达该
@everywhere
行(竞争条件)。因此,
@everywhere
最好与同步代码一起使用,以避免竞争和其他计时错误,而上述
for
循环则不然。

在您的代码中,可能不需要函数本身的@everywhere,并且由于函数及其变量

fine_solve
都是在创建线程之前定义的,因此只要每个线程只修改自己的部分,您的代码就可以正常工作
fine_solve
。这在您的代码中是正确的,因为每个线程访问
fine_solve
的不同部分,由
j
的唯一值定义。

© www.soinside.com 2019 - 2024. All rights reserved.