ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

複数のデータセットに対する同時実行

はじめに

single program multiple data (spmd) 言語構成を使用すると、逐次プログラミングと並列プログラミングをシームレスにインターリーブできます。spmd ステートメントには、複数のワーカーで同時に実行されるコード ブロックを定義できます。ワーカーの spmd ステートメント内で割り当てられた変数の値には、Composite (複合) オブジェクトを介した参照によってクライアントから直接アクセスできます。

この章では、spmd ステートメントと Composite オブジェクトのいくつかの特性について説明します。

どのような時に spmd を使用するか

spmd における "single program (単一プログラム)" の側面は、同一のコードが複数のワーカーで実行されるということです。MATLAB® クライアントで 1 つのプログラムを実行すると、spmd ブロックというラベルが付いたそのプログラムの部分がワーカーで実行されます。spmd ブロックが完了すると、プログラムはクライアントでの実行を継続します。

"multiple data (複数のデータ)" の側面は、spmd ステートメントによりすべてのワーカーで同一コードが実行されても、そのコードに対しワーカーごとに固有の異なるデータを使用できるということです。このため、複数ワーカーによる複数データセットへの対応が可能になります。

spmd に適した典型的アプリケーションは、ワーカー間で通信または同期が必要な場合に複数のデータセットに対してプログラムの同時実行が必要なアプリケーションです。一般的なケースとして以下が挙げられます。

  • 実行に長時間かかるプログラム — spmd を使用すると、複数のワーカーで同時に解を計算できます。

  • 大規模なデータセットを扱うプログラム — spmd によってデータを複数のワーカーに分散できます。

matlabpool を使用した MATLAB リソースの設定

関数 matlabpool を使用して、後続の spmd ステートメントまたは parfor ループを実行するために複数の MATLAB ワーカーを確保します。スケジューラに応じて、ワーカーはリモートのクラスターで実行されるか、またはローカルの MATLAB クライアント マシンで実行されます。クラスターを指定するにはクラスター プロファイルを選択します。プロファイルの管理および使用の方法については、「クラスター プロファイル」を参照してください。

この節の例を開始するため、spmd ステートメントの評価用にローカルの MATLAB ワーカーを割り当てます。

matlabpool

このコマンドにより、既定のクラスター プロファイルで定義されている数の MATLAB ワーカー セッションが起動します。ローカル プロファイルが既定の設定でありワーカー数が指定されない場合は、このコマンドによってローカルの MATLAB クライアント マシンでコアあたり 1 つ (最大 12) のワーカーが起動します。

既定の設定を使用しない場合は、使用するワーカー数またはプロファイルを matlabpool ステートメントで指定できます。たとえば、既定のプロファイルで 3 つのワーカーだけを使用する場合は、次のように入力します。

matlabpool 3

異なるプロファイルを使用する場合は、次のように入力します。

matlabpool MyProfileName

現在 MATLAB プールが開いているかどうかを調べるには、次のように入力します。

matlabpool size

このコマンドは現在のプール内のワーカー数を示す値を返します。このコマンドで 0 が返される場合、現在開いているプールはありません。

    メモ:    開いている MATLAB プールがなく、Parallel Computing Toolbox™ ソフトウェアがインストールされている場合、spmd ステートメントは並列実行なしにローカルの MATLAB クライアントで実行されます。つまり、ワーカーが単一であるかのようにクライアント セッションで実行されます。

MATLAB プールの使用が終了したら、次のコマンドでプールを閉じます。

matlabpool close

spmd ステートメントの定義

spmd ステートメントの一般的な形式は、次のとおりです。

spmd
    <statements>
end

<statements> で表されるコード ブロックは、MATLAB プール内のすべてのワーカーで同時に並列実行されます。実行をこれらのワーカーの一部に制限する場合は、実行に使用するワーカーの正確な数を指定します。

spmd (n)
    <statements>
end

このステートメントは、n 個のワーカーが spmd コードを実行するよう要求します。n は開いている MATLAB プール内のワーカーの数以下でなければなりません。プールは十分に大きいものの n 個のワーカーは使用可能でない場合、ステートメントは十分な数のワーカーが使用可能になるまで待機します。n が 0 で、spmd ステートメントがワーカーを使用せずにクライアントでローカルに実行される場合は、現在開いているプールがない場合と同じになります。

ワーカー数の範囲を指定できます。

spmd (m, n)
    <statements>
end

この場合、spmd ステートメントには最低 m 個のワーカーが必要であり、最大で n 個のワーカーを使用します。

spmd ステートメントを実行するワーカー数の制御が重要な場合は、範囲を使用するのでなく、正確な数をクラスター プロファイルか spmd ステートメントで設定します。

たとえば、3 つのワーカー上に乱数行列を作成するには、以下を入力します。

matlabpool
spmd (3)
    R = rand(4,4);
end
matlabpool close

    メモ:    この章のこれ以降の例では、MATLAB プールが既に開いており、spmd ステートメントのシーケンスの合間も開いたままであることを前提としています。

parfor ループと異なり、spmd ステートメントに使用されるワーカーにはそれぞれ固有の labindex 値があります。このため、通常は固有のデータにアクセスする目的で、コードが特定のワーカーのみで実行されるように、あるいは実行をカスタマイズするように指定できます。

たとえば、labindex に応じて異なるサイズの配列を作成します。

spmd (3)
    if labindex==1 
        R = rand(9,9);
      else
        R = rand(4,4);
    end
end

各ワーカーで labindex に応じた固有のデータを読み込み、各ワーカーで同じ関数を使用してデータから結果を算出します。

spmd (3)
    labdata = load(['datafile_' num2str(labindex) '.ascii'])
    result = MyFunction(labdata)
end

spmd ステートメントを実行する複数のワーカーは同時に動作し、互いを認識しています。並列ジョブの場合と同様に、ワーカー間で直接に通信を制御し、データを転送し、対話型分散配列を使用することができます。

たとえば、spmd ステートメントで対話型分散配列を使用します。

spmd (3)
    RR = rand(30, codistributor());
end

各ワーカーには対話型分散配列 RR からの 30 行 10 列のセグメントがあります。対話型分散配列についての詳細は、「対話型分散配列の取り扱い」を参照してください。

出力の表示

MATLAB プールで spmd ステートメントを実行する場合、ワーカーからのコマンド ライン出力は、すべてクライアントのコマンド ウィンドウに表示されます。ワーカーは表示のない MATLAB セッションであるため、プールからはグラフィカルな出力 (Figure ウィンドウなど) は一切表示されません。

この情報は役に立ちましたか?