Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

spmd

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

構文

spmd
    statements
end

説明

spmd, statements, endspmd ステートメントを単一行で定義します。MATLAB® は、statements で示された spmd の本体を複数の MATLAB ワーカーで同時に実行します。各ワーカーは異なるデータセット、または分散データの異なる部分を処理することができ、並列計算の実行中に他の参加ワーカーと通信できます。spmd ステートメントは、Parallel Computing Toolbox™ がインストールされている場合に限り使用できます。ステートメントを並列実行するには、まず parpool を使用して MATLAB ワーカーのプールを作成するか、並列基本設定でプールの自動起動を許可しなければなりません。

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

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 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(spmdIndex + 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 で並列計算を実行することができます。

MATLAB で使用可能な GPU の数を特定するには、関数gpuDeviceCountを使用します。

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

使用可能な GPU と同数のワーカーをもつ並列プールを起動します。最良のパフォーマンスを得るために、MATLAB は既定でワーカーごとに別々の GPU を割り当てます。

parpool('Processes',availableGPUs);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).

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

spmd
    gpuDevice
end

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

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

delete(gcp('nocreate'));

他の GPU を選択して使用する場合は、gpuDevice で GPU デバイス インデックスを使用して、各ワーカーで特定の GPU を選択できます。関数 gpuDeviceCount を使用すると、システム内の各 GPU デバイスのインデックスを取得できます。

システム内に使用可能な GPU が 3 つあり、その中の 2 つだけを計算に使用するとします。デバイスのインデックスを取得します。

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

使用するデバイスのインデックスを定義します。

useGPUs = [1 3];

並列プールを起動します。spmd ブロックと gpuDevice を使用して、各ワーカーと使用する GPU のいずれかをデバイス インデックスにより関連付けます。関数 spmdIndex は各ワーカーのインデックスを識別します。

parpool('Processes',numel(useGPUs));
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(spmdIndex));
end

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

計算が完了したら、並列プールをシャットダウンします。

delete(gcp('nocreate'));

ヒント

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

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

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

  • spmd および他の並列プログラミング構成のパフォーマンスの詳細については、spmd、parfor、および parfeval からの選択を参照してください。

バージョン履歴

R2008b で導入