ドキュメンテーション

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

spmd

並列プールのワーカーでコードを並列実行する

構文

spmd
    statements
end

説明

spmd, statements, endspmd ステートメントを単一行で定義します。MATLAB® は、statements で示された spmd の本体を複数の MATLAB ワーカーで同時に実行します。spmd ステートメントは、Parallel Computing Toolbox™ がインストールされている場合に限り使用できます。ステートメントを並列実行するには、まず parpool を使用して MATLAB ワーカーのプールを作成するか、並列設定でプールの自動起動を許可しなければなりません。

spmd ステートメントの本体において、各 MATLAB ワーカーには一意の labindex 値が設けられ、numlabs によりブロックを並列で実行するワーカーの合計数が指定されます。spmd ステートメントの本体内では、通信ジョブの通信関数 (labSendlabReceive など) はワーカー間でデータを転送できます。

spmd ステートメントの本体から返される値は、MATLAB クライアントで Composite オブジェクトに変換されます。Composite オブジェクトには、リモートの MATLAB ワーカーに保存されている値への参照が含まれます。この値は cell 配列インデックスを使用して取得できます。Composite がクライアントに存在し並列プールが開いている限り、ワーカーにある実際のデータは、以降の spmd 実行でも引き続き使用可能です。

既定では、MATLAB はプール内のすべてのワーカーを使用します。どのプールもアクティブではない場合、MATLAB はプールを作成し、そのプールのすべてのワーカーを使用します。設定でプールの自動作成が許可されていない場合、MATLAB はローカルでブロック本体を実行し、必要に応じて Composite オブジェクトを作成します。いずれかのワーカーが parfeval 要求を実行中の場合、spmd(0) を使用しない限り、spmd ブロックを実行することはできません。

spmd と Composite オブジェクトの詳細については、配列の分散および SPMD の実行を参照してください。

メモ:

clearを使用する場合は、parforspmd ではなくparfevalOnAllを使用してください。これにより、ワークスペースの透過性が維持されます。parfor ループまたは spmd ステートメント内での透過性の確保を参照してください。

spmd(n), statements, end は、並列プールで n 個のワーカーが使用可能な場合、statements を評価する MATLAB ワーカーの正確な数を n を使用して指定します。十分な数のワーカーが使用可能でない場合は、エラーがスローされます。n がゼロの場合、MATLAB は、使用可能なプールがない場合と同様にブロックの本体をローカルで実行し、Composite オブジェクトを作成します。

spmd(m,n), statements, end は最小で m 個、最大で n 個のワーカーを使用して statements を評価します。十分な数のワーカーが使用可能でない場合は、エラーがスローされます。m はゼロとすることもでき、その場合、使用可能なワーカーがなければブロックはローカルで実行されます。

すべて折りたたむ

並列プールを作成し、spmd を使用して単純な計算を並列実行します。MATLAB は、並列プール内のすべてのワーカー上で spmd 内のコードを実行します。

parpool(3);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(labindex + 2);
end

結果をプロットします。

figure
subplot(1,3,1), imagesc(q{1});
subplot(1,3,2), imagesc(q{2});
subplot(1,3,3), imagesc(q{3});

計算が完了したら、現在の並列プールを削除できます。

delete(gcp);

複数の GPU にアクセスできる場合、並列プールを使用して複数の GPU で並列計算を実行することができます。

GPU と同数のワーカーをもつ並列プールを開始します。利用可能な GPU の数を調べるには、関数gpuDeviceCountを使用します。既定で、MATLAB は最大のパフォーマンスを得るために各ワーカーに異なる GPU を割り当てます。

parpool('local',gpuDeviceCount);

各ワーカーが使用している GPU を識別するために、spmd ブロック内で gpuDevice を呼び出します。spmd ブロックは各ワーカーで gpuDevice を実行します。

spmd
    gpuDevice
end

parforparfeval などの並列言語機能を使用して、並列プールのワーカーに計算を分散します。計算に gpuArray 対応関数を使用すると、これらの関数はワーカーの GPU で実行されます。詳細については、GPU での MATLAB 関数の実行を参照してください。例は、複数の GPU での MATLAB 関数の実行を参照してください。

計算が完了したら、並列プールをシャットダウンします。関数 gcp を使用して、現在の並列プールを取得できます。

delete(gcp('nocreate'));

他の GPU を選択して使用する場合、gpuDevice を使用して各ワーカー上の特定の GPU を選択できます。各ワーカーで有効にする GPU のインデックスを含む配列 (gpuIndices など) を定義します。次に、選択する GPU と同じ数のワーカーをもつ並列プールを起動し、spmd ブロックを使用して各ワーカーで gpuDevice を実行します。関数 labindex が各ワーカーを識別します。この関数を使用してワーカーを GPU インデックスと関連付けます。

gpuIndices = [1 3];
parpool(numel(gpuIndices));
spmd
    gpuDevice(gpuIndices(labindex));
end

ベスト プラクティスとして、また最良のパフォーマンスを得るには、各ワーカーに異なる GPU を割り当てます。

ヒント

  • spmd ブロックは既存の並列プールのワーカーで実行されます。プールがない場合、並列設定でプールの自動起動が無効になっていなければ、spmd により新しい並列プールが起動されます。並列プールがなく、spmd による並列プールの起動もできない場合、コードはクライアント セッションで逐次実行されます。

  • 並列プールのクラスター プロファイルの AutoAttachFiles プロパティが true に設定されている場合、MATLAB は spmd ブロックを解析して実行に必要なコード ファイルを決定し、自動的にそれらのファイルを並列プール ジョブに加えて、コードをワーカーで使用できるようにします。

  • spmd を使用する際の制約と制限の詳細については、複数のデータセットでの単一プログラムの実行を参照してください。

R2008b で導入