Shared Arrays
SharedArray 表示一个数组,该数组在单台机器上的多个进程之间共享。
SharedArrays.SharedArray — TypeSharedArray{T}(dims::NTuple; init=false, pids=Int[])
SharedArray{T,N}(...)构造一个位类型 T 的 SharedArray,大小为 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 指定的进程 - 所有进程必须在同一主机上。该文件被映射到主机内存中,具有以下后果:
- 数组数据必须以二进制格式表示(例如,像 CSV 这样的 ASCII 格式不支持)
- 你对数组值所做的任何更改(例如,
A[3] = 0)也会更改磁盘上的值
如果 pids 未指定,则共享数组将在当前主机上的所有进程中映射,包括主进程。但是,localindices 和 indexpids 仅会引用工作进程。这便于工作分配代码使用工作进程进行实际计算,而主进程充当驱动程序。
mode 必须是 "r"、"r+"、"w+" 或 "a+" 之一,如果由 filename 指定的文件已存在,则默认为 "r+",如果不存在,则默认为 "w+"。如果指定了类型为 initfn(S::SharedArray) 的 init 函数,则会在所有参与的工作进程上调用它。如果文件不可写,则不能指定 init 函数。
offset 允许你跳过文件开头指定数量的字节。
SharedArrays.SharedVector — TypeSharedVector一维 SharedArray。
SharedArrays.SharedMatrix — TypeSharedMatrix一个二维 SharedArray。
Distributed.procs — Methodprocs(S::SharedArray)获取映射共享数组的进程向量。
SharedArrays.sdata — Functionsdata(S::SharedArray)返回实际支持 S 的 Array 对象。
SharedArrays.indexpids — Functionindexpids(S::SharedArray)返回当前工作者在映射 SharedArray 的工作者列表中的索引(即在 procs(S) 返回的相同列表中),如果 SharedArray 没有在本地映射,则返回 0。
SharedArrays.localindices — Functionlocalindices(S::SharedArray)返回一个范围,描述当前进程要处理的“默认”索引。这个范围应被解释为线性索引的意义,即作为 1:length(S) 的子范围。在多进程上下文中,在父进程(或任何 indexpids 返回 0 的进程)中返回一个空范围。
值得强调的是,localindices 纯粹作为一种便利存在,您可以根据自己的意愿在数组上将工作分配给工作进程。对于 SharedArray,所有索引对每个工作进程来说应该是同样快速的。