共用陣列

SharedArray 表示陣列,此陣列在單一機器上由多個程序共用。

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

pids 指定的程序中,建構一個位元類型 T 和大小 dimsSharedArray,而這些程序必須都在同一個主機上。如果透過呼叫 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}(...)

建立一個 SharedArray,它由檔案 filename、元素類型 T (必須是位元類型) 和大小 dims 所支援,並跨越由 pids 指定的程序 - 所有程序都必須在同一個主機上。此檔案會以 mmap 方式對應到主機記憶體,並有以下後果

  • 陣列資料必須以二進位格式表示 (例如,不支援 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,所有索引對於每個工作程序都應同樣快速。

來源