共享数组
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
,则共享数组将跨当前主机上的所有进程进行映射,包括主进程。但是,localindices
和 indexpids
将仅引用工作进程。这有利于工作分配代码使用工作进程进行实际计算,而主进程充当驱动程序。
如果指定了类型为 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
,则共享数组将跨当前主机上的所有进程进行映射,包括主进程。但是,localindices
和 indexpids
将仅引用工作进程。这有利于工作分配代码使用工作进程进行实际计算,而主进程充当驱动程序。
mode
必须是 "r"
、"r+"
、"w+"
或 "a+"
之一,如果由 filename
指定的文件已存在,则默认为 "r+"
,如果不存在,则默认为 "w+"
。如果指定了类型为 initfn(S::SharedArray)
的 init
函数,则会在所有参与的工作进程上调用该函数。如果文件不可写,则不能指定 init
函数。
offset
允许您跳过文件开头指定的字节数。
SharedArrays.SharedVector
— 类型SharedVector
一维 SharedArray
。
SharedArrays.SharedMatrix
— 类型SharedMatrix
二维 SharedArray
。
Distributed.procs
— 方法procs(S::SharedArray)
获取映射共享数组的进程向量。
SharedArrays.sdata
— 函数sdata(S::SharedArray)
返回支持 S
的实际 Array
对象。
SharedArrays.indexpids
— 函数indexpids(S::SharedArray)
返回当前工作进程在映射 SharedArray
的工作进程列表中的索引(即在 procs(S)
返回的相同列表中),如果 SharedArray
未在本地映射,则返回 0。
SharedArrays.localindices
— 函数localindices(S::SharedArray)
返回一个范围,描述当前进程要处理的“默认”索引。此范围应以线性索引的意义来解释,即作为 1:length(S)
的子范围。在多进程环境中,在父进程(或任何 indexpids
返回 0 的进程)中返回一个空范围。
值得强调的是,localindices
只是一个便利工具,您可以根据需要以任何方式在工作进程之间划分数组上的工作。对于 SharedArray
,所有索引对于每个工作进程来说都应该同样快。