分散配列の作成と使用
データが現在ローカル マシンのメモリにある場合、関数 distributed
を使用して、既存の配列をクライアント ワークスペースから並列プールのワーカーに分散できます。Distributed
配列では、1 つの並列プール内にある複数のワーカーの結合したメモリを使用して、配列の要素を格納します。データを分割する代替方法については、並列ワーカーへの配列の分散を参照してください。ユーザーは配列全体を単一のエンティティとして操作しますが、ワーカーはそれぞれに割り当てられた配列の部分のみを処理し、必要に応じて自動的にワーカー間でデータを転送します。distributed
配列を使用して、ビッグ データの計算をスケールアップできます。クラスターにアクセスできる場合は、distributed
配列の使用を検討してください。クラスター内にある複数のマシンのメモリを結合することができます。
distributed
配列は単一の変数で、並列プールの複数のワーカーに分割されます。この変数は、分散の特性について心配することなく、単一のエンティティとして使用できます。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) % Create pool A = magic(4); % Create magic 4-by-4 matrix B = distributed(A); % Distribute to the workers B % View results in client. whos % B is a distributed array here. delete(gcp) % Stop pool
B
は distributed
配列として作成され、並列プール内のワーカーに分割されています。これは次の図で示されます。
対話型分散配列の作成
distributed
配列とは異なり、codistributed
配列では、次元や分割など、分散のあらゆる側面を制御できます。codistributed
配列は次の異なる方法で作成できます。
大きな配列の分割 — すべてのワーカー上で複製された大きな配列から始め、それを分割して各部分をワーカーに分散します。これは、最初の複製された配列を格納する十分なメモリがある場合に最も役に立ちます。
小さな配列からの作成 — 各ワーカーに格納された小さな複製された配列から始め、それらを結合して、各配列を大きな対話型分散配列のセグメントにします。この方法では、小さな部分から対話型分散配列を作成できるため、メモリ要件が少なくて済みます。
MATLAB コンストラクター関数の使用 —
rand
やzeros
など任意の MATLAB® コンストラクター関数を対話型分散オブジェクトの引数と共に使用します。これらの関数により、任意サイズの対話型分散配列をワン ステップですばやく作成できます。
次の例では、既定ではない分散スキームを使用して、spmd
ステートメント内で codistributed
配列を作成します。まず、3 番目の次元に沿って 1 次元の分散を定義し、ワーカー 1 に 4 つの部分、ワーカー 2 に 12 の部分を割り当てます。続いて、ゼロからなる 3 x 3 x 16 の配列を作成します。
parpool('Processes',2) % Create pool spmd codist = codistributor1d(3,[4,12]); Z = zeros(3,3,16,codist); Z = Z + spmdIndex; end Z % View results in client. whos % Z is a distributed array here. delete(gcp) % Stop pool
対話型分散配列についての詳細は、対話型分散配列の取り扱いを参照してください。