分散配列の作成と使用
データが現在ローカル マシンのメモリにある場合は、関数 distributed
を使用して、既存の配列をクライアント ワークスペースから並列プールのワーカーに分散することができます。分散配列では、1 つの並列プール内にある複数のワーカーの結合したメモリを使用して、配列の要素を格納します。データを分割する代替方法については、並列ワーカーへの配列の分散を参照してください。ユーザーは配列全体を単一のエンティティとして操作しますが、ワーカーはそれぞれに割り当てられた配列の部分のみを処理し、必要に応じて自動的にワーカー間でデータを転送します。分散配列を使用して、ビッグ データの計算をスケールアップできます。クラスターにアクセスできる場合は、分散配列の使用を検討してください。クラスター内にある複数のマシンのメモリを結合することができます。
distributed
配列は単一の変数で、並列プールの複数のワーカーに分割されます。この変数は、分散の特性について心配することなく、単一のエンティティとして使用できます。分散配列で使用できる Parallel Computing Toolbox™ の機能については、分散配列を使用した MATLAB 関数の実行を参照してください。
distributed
配列を作成する場合は、分散の詳細を制御できません。一方、codistributed
配列では、次元や分割など、分散のあらゆる側面を制御できます。以下では、distributed
配列と codistributed
配列の両方を作成する方法を学習します。
分散配列の作成
分散配列は次の異なる方法で作成できます。
関数
distributed
を使用して、既存の配列をクライアント ワークスペースから並列プールのワーカーに分散する。1 つの分散配列を複数のワーカーに直接作成できる。あらかじめクライアントでこの配列を作成する必要がないため、クライアント ワークスペースのメモリ要件が少なくて済みます。使用できる関数には、
やeye
(___,"distributed")
などがあります。完全な一覧については、rand
(___,"distributed")distributed
オブジェクトのリファレンス ページの「代替機能」のセクションを参照してください。spmd
ステートメントの内部でcodistributed
配列を作成する (Single Program Multiple Data (spmd)を参照)。次に、spmd
ステートメント外でdistributed
配列としてアクセスします。これにより、既定の設定以外の分散スキームを使用できます。
以下の例では、クライアント ワークスペースに配列を作成し、それを分散配列にしています。
既存のプールが開いていない場合は、新規プールを作成します。
parpool("Processes",4)
クライアントで 4 行 4 列の魔方陣行列を作成し、その行列をワーカーに分散します。クライアントで結果を確認し、変数に関する情報を表示します。
A = magic(4); B = distributed(A); B whos
Name Size Bytes Class Attributes A 4x4 128 double B 4x4 128 distributed
B
は distributed
配列として作成され、並列プール内のワーカーに分割されています。これは下図で示されます。分散配列は、さらなる計算のために準備ができています。
分散配列の使用が完了したら、プールを閉じます。
delete(gcp)
対話型分散配列の作成
distributed
配列とは異なり、codistributed
配列では、次元や分割など、分散のあらゆる側面を制御できます。codistributed
配列は次の異なる方法で作成できます。
大きな配列の分割 — すべてのワーカー上で複製された大きな配列から始め、それを分割して各部分をワーカーに分散します。これは、最初の複製された配列を格納する十分なメモリがある場合に最も役に立ちます。
小さな配列からの作成 — 各ワーカーに格納された小さな複製された配列から始め、それらを結合して、各配列を大きな対話型分散配列のセグメントにします。この方法では、小さな部分から対話型分散配列を作成できるため、メモリ要件が少なくて済みます。
MATLAB コンストラクター関数の使用 —
rand
やzeros
など任意の MATLAB® コンストラクター関数を対話型分散オブジェクトの引数と共に使用します。これらの関数により、任意サイズの対話型分散配列をワン ステップですばやく作成できます。
次の例では、既定ではない分散スキームを使用して、spmd
ステートメント内で codistributed
配列を作成します。
2 つのワーカーをもつ並列プールを作成します。
parpool("Processes",2)
spmd ステートメントで、3 番目の次元に沿って 1 次元の分散を定義し、ワーカー 1 に 4 つの部分、ワーカー 2 に 12 の部分を割り当てます。続いて、ゼロからなる 3×3×16 の配列を作成します。クライアントで codistributed
配列を確認し、変数に関する情報を表示します。
spmd codist = codistributor1d(3,[4,12]); Z = zeros(3,3,16,codist); Z = Z + spmdIndex; end Z whos
Name Size Bytes Class Attributes Z 3x3x16 1152 distributed codist 1x2 265 Composite
対話型分散配列の使用が完了したら、プールを閉じます。
delete(gcp)
対話型分散配列の詳細については、対話型分散配列の取り扱いを参照してください。