Main Content

分散配列の作成と使用

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

Bdistributed 配列として作成され、並列プール内のワーカーに分割されています。これは下図で示されます。分散配列は、さらなる計算のために準備ができています。

Array split by column over four workers.

分散配列の使用が完了したら、プールを閉じます。

delete(gcp)

対話型分散配列の作成

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

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

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

  • MATLAB コンストラクター関数の使用randzeros など任意の 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)

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

関連するトピック