分散配列の作成と使用

データが現在ローカル マシンのメモリにある場合、関数 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('local',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

Bdistributed 配列として作成され、並列プール内のワーカーに分割されています。これは次の図で示されます。

対話型分散配列の作成

distributed 配列とは異なり、codistributed 配列では、次元や分割など、分散のあらゆる側面を制御できます。codistributed 配列は次の異なる方法で作成できます。

  • 大きな配列の分割 — すべてのワーカー上で複製された大きな配列から始め、それを分割して各部分をワーカーに分散します。これは、最初の複製された配列を格納する十分なメモリがある場合に最も役に立ちます。

  • 小さな配列からの作成 — 各ワーカーに格納された小さな複製された配列から始め、それらを結合して、各配列を大きな対話型分散配列のセグメントにします。この方法では、小さな部分から対話型分散配列を作成できるため、メモリ要件が少なくて済みます。

  • MATLAB コンストラクター関数の使用randzeros など任意の MATLAB® コンストラクター関数を対話型分散オブジェクトの引数と共に使用します。これらの関数により、任意サイズの対話型分散配列をワン ステップですばやく作成できます。

次の例では、既定ではない分散スキームを使用して、spmd ステートメント内で codistributed 配列を作成します。まず、3 番目の次元に沿って 1 次元の分散を定義し、ワーカー 1 に 4 つの部分、ワーカー 2 に 12 の部分を割り当てます。続いて、ゼロからなる 3 x 3 x 16 の配列を作成します。

parpool('local',2) % Create pool
spmd
    codist = codistributor1d(3,[4,12]);
    Z = zeros(3,3,16,codist);
    Z = Z + labindex;
end
Z           % View results in client.
whos        % Z is a distributed array here.
delete(gcp) % Stop pool

対話型分散配列についての詳細は、対話型分散配列の取り扱いを参照してください。

関連するトピック