SharedArrays
SharedArrays.SharedArray ── 型
SharedArray{T}(dims::NTuple; init=false, pids=Int[])
SharedArray{T,N}(...)
ビット型 T の要素を持つサイズ dims の共有配列を構築します。pids は構築される共有配列を共有するプロセスの集合を表し、この集合に含まれるプロセスは同じホスト上にある必要があります。SharedArray{T,N}(dims) と N が指定されるなら、N は dims の長さと一致しなければなりません。
pids が指定されないと、共有配列は現在のホスト上の全てのプロセス (マスター含む) にマップされます。ただし localindices と indexpids で「マップしているプロセス」とみなされるのはワーカープロセスだけです。そのため、これらの関数を使うと、マスタープロセスをドライバとして使って実際の計算をワーカーで行わせる分散コードを簡単に書けるようになります。
initfn(S::SharedArray) 型の関数 init が指定されると、配列を共有するワーカー全てで init が呼び出されます。
返り値の共有配列は、マッピングを作成したノードで SharedArray オブジェクトへの参照が存在する間だけ有効になります。
SharedArray{T}(filename::AbstractString,
dims::NTuple,
[offset=0];
mode=nothing,
init=false,
pids=Int[])
SharedArray{T,N}(...)
ファイル filename を内部で利用する SharedArray を構築します。構築される共有配列の要素型はビット型 T で、サイズは dims です。pids は構築される共有配列を共有するプロセスの集合を表し、この集合に含まれるプロセスは同じホスト上にある必要があります。このファイルはホストのメモリに mmap されるので、次の点に注意が必要です:
-
配列のデータはバイナリフォーマットでなければなりません (CSV のような ASCII フォーマットはサポートされません)。
-
配列の値を変更 (例えば
A[3] = 0) すると、ディスク上の値も変更されます。
pids が指定されないと、共有配列は現在のホスト上の全てのプロセス (マスター含む) にマップされます。ただし localindices と indexpids で「マップしているプロセス」とみなされるのはワーカープロセスだけです。そのためこれらの関数を使うと、マスタープロセスをドライバとして使って実際の計算をワーカーで行わせる分散コードを簡単に書けるようになります。
mode に指定できるのは "r", "r+", "w+", "a+" のどれか一つです。デフォルトでは filename が指定するファイルが存在するなら "r+" で、存在しないなら "w+" です。initfn(S::SharedArray) 型の関数 init が指定されると、配列を共有するワーカー全てで init が呼び出されます。ファイルに書き込めないときは init 関数を指定できません。
offset を使うと、ファイルの先頭から指定したバイト数だけ読み飛ばすことができます。
Distributed.procs ── メソッド
SharedArrays.sdata ── 関数
SharedArrays.indexpids ── 関数
SharedArrays.localindices ── 関数
localindices(S::SharedArray)
現在のプロセスが処理する "デフォルト" の添え字を表す区間を返します。この区間は線形添え字として、つまり 1:length(S) の部分区間として解釈されるべきです。マルチプロセス環境では、親プロセス (および indexpids が 0 を返す任意のプロセス) で呼び出すと空の区間が返ります。
localindices は利便性のためだけに存在しており、ワーカーが共有配列に行う処理はどのように分割しても構わないことは強調に値します。SharedArray に関して言えば、全ての添え字はどのワーカープロセスに対しても同じ速度を持つはずです。