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
,所有索引对每个工作进程来说应该是同样快速的。