メインコンテンツ

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

spmd

R2026a

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

構文

spmd
    statements
end

説明

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

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

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

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

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

メモ

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

例

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

例

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

例

spmd(pool,___), statements, end は、parallel.Pool オブジェクト pool で指定された並列プールで statements を評価します。この構文は、gcp 関数から返されるプール以外のプールで spmd ステートメントを評価する場合に使用します。 (R2025a 以降)

例

例

すべて折りたたむ

並列プールを作成し、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

parforやparfevalなどの並列言語機能を使用して、並列プールのワーカーに計算を分散します。計算に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"));

R2025a 以降

リモート クラスター プロファイル myMJSCluster を使用して並列プールを起動します。

myClusterPool = parpool("myMJSCluster",15);
Starting parallel pool (parpool) using the 'myMJSCluster' profile ...
Connected to parallel pool with 15 workers.

myClusterPool プールから 6 個のワーカーのプールを分割します。

spmdWorkers = myClusterPool.Workers(1:6);
[spmdPool,otherPool] = partition(myClusterPool,"Workers",spmdWorkers);

spmdPool プールのワーカーを使用して pi の推定値を計算します。

fun = @(x) 4./(1 + x.^2);
spmd(spmdPool)
    a = (spmdIndex - 1)/spmdSize;
    b = spmdIndex/spmdSize;
    myIntegral = integral(fun,a,b);
    piApprox = spmdPlus(myIntegral);
end

approx1 = piApprox{1};
fprintf("pi           : %.18f\n" + ...
    "Approximation: %.18f\n" + ...
    "Error        : %g\n", pi,approx1,abs(pi - approx1));
pi           : 3.141592653589793116
Approximation: 3.141592653589793116
Error        : 0

入力引数

すべて折りたたむ

R2025a 以降

spmd ステートメントを評価するプール。parallel.Pool オブジェクトとして指定します。

  • 並列プールを作成するには、parpool を使用。

  • 既存のプールのサブセットを使用するには、partition を使用。

ヒント

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

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

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

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

拡張機能

すべて展開する

バージョン履歴

R2008b で導入

すべて展開する