共享数组

SharedArray 表示一个数组,该数组在单个机器上的多个进程之间共享。

SharedArrays.SharedArray类型
SharedArray{T}(dims::NTuple; init=false, pids=Int[])
SharedArray{T,N}(...)

构造一个 SharedArray,其位类型为 T,大小为 dims,跨越由 pids 指定的进程(所有进程都必须在同一主机上)。如果通过调用 SharedArray{T,N}(dims) 指定了 N,则 N 必须与 dims 的长度匹配。

如果未指定 pids,则共享数组将跨当前主机上的所有进程进行映射,包括主进程。但是,localindicesindexpids 将仅引用工作进程。这有利于工作分配代码使用工作进程进行实际计算,而主进程充当驱动程序。

如果指定了类型为 initfn(S::SharedArray)init 函数,则会在所有参与的工作进程上调用该函数。

只要在创建映射的节点上存在对 SharedArray 对象的引用,共享数组就有效。

SharedArray{T}(filename::AbstractString, dims::NTuple, [offset=0]; mode=nothing, init=false, pids=Int[])
SharedArray{T,N}(...)

构造一个由文件 filename 支持的 SharedArray,其元素类型为 T(必须是位类型),大小为 dims,跨越由 pids 指定的进程(所有进程都必须在同一主机上)。该文件被 mmapped 到主机内存中,具有以下结果

  • 数组数据必须以二进制格式表示(例如,CSV 这样的 ASCII 格式不支持)

  • 对数组值进行的任何更改(例如,A[3] = 0)也会更改磁盘上的值

如果未指定 pids,则共享数组将跨当前主机上的所有进程进行映射,包括主进程。但是,localindicesindexpids 将仅引用工作进程。这有利于工作分配代码使用工作进程进行实际计算,而主进程充当驱动程序。

mode 必须是 "r""r+""w+""a+" 之一,如果由 filename 指定的文件已存在,则默认为 "r+",如果不存在,则默认为 "w+"。如果指定了类型为 initfn(S::SharedArray)init 函数,则会在所有参与的工作进程上调用该函数。如果文件不可写,则不能指定 init 函数。

offset 允许您跳过文件开头指定的字节数。

来源
SharedArrays.indexpids函数
indexpids(S::SharedArray)

返回当前工作进程在映射 SharedArray 的工作进程列表中的索引(即在 procs(S) 返回的相同列表中),如果 SharedArray 未在本地映射,则返回 0。

来源
SharedArrays.localindices函数
localindices(S::SharedArray)

返回一个范围,描述当前进程要处理的“默认”索引。此范围应以线性索引的意义来解释,即作为 1:length(S) 的子范围。在多进程环境中,在父进程(或任何 indexpids 返回 0 的进程)中返回一个空范围。

值得强调的是,localindices 只是一个便利工具,您可以根据需要以任何方式在工作进程之间划分数组上的工作。对于 SharedArray,所有索引对于每个工作进程来说都应该同样快。

来源