Main Content

parpool

クラスターでの並列プールの作成

説明

parpool は、既定のプロファイルを使用してワーカーの並列プールを起動します。既定の基本設定を使用すると、MATLAB® はローカル マシン上で 1 つの物理 CPU コアにつき 1 つのワーカーをもつプール (既定のプロファイルで設定された上限まで) を起動します。並列基本設定の詳細については、並列基本設定の指定を参照してください。

通常、プールのサイズは既定のプロファイルの PreferredPoolNumWorkers プロパティで指定されます。プール サイズに影響を及ぼす可能性のあるすべての要因については、プール サイズに影響する要因を参照してください。

parpool はワーカーのプールに特別なジョブを作成し、MATLAB クライアントを並列プールに接続することで、MATLAB の並列言語機能をすべて使用可能にします。並列言語機能には parforparfevalparfevalOnAllspmd および distributed が含まれます。可能な場合には、ワーカーの作業フォルダーは MATLAB クライアント セッションの作業フォルダーと一致するように設定されます。

parpool(poolsize) は、指定されたワーカー数のプールを作成して返します。poolsize には正の整数か、または整数の 2 要素ベクトルとして指定された範囲を使用できます。poolsize が範囲の場合、結果のプールのサイズは要求された範囲で最大になります。

poolsize を指定すると、PreferredPoolNumWorkers プロパティで指定された値がオーバーライドされます。また、ワーカーが使用可能になるまで待機しなければならない場合でも、正確にその数のワーカーからなるプールが起動されます。大部分のクラスターでは、開始できるワーカーの最大数が決まっています。プロファイルで MATLAB ジョブ スケジューラ クラスターが指定されている場合、parpool は使用するワーカーを、既に実行中のワーカーとその MATLAB ジョブ スケジューラで使用可能なワーカーから確保します。プロファイルでローカルまたはサードパーティ製スケジューラが指定されている場合、parpool はプールのワーカーを起動するようそのスケジューラに指示します。

parpool(resources) または parpool(resources,poolsize) は、resources で指定されたリソース上にあるワーカー プールを起動します。

parpool(___,Name,Value) は、プールを起動する際に特定のプロパティに対して指定した値を適用します。

poolobj = parpool(___) はクラスターのプールを示す parallel.Pool オブジェクトをクライアント ワークスペースに返します。このプール オブジェクトを使用すると、プールをプログラムにより削除したり、プールのプロパティにアクセスすることができます。並列プールをシャットダウンするには、delete(pool) を使用します。

すべて折りたたむ

ワーカー数を定義する既定のプロファイルを使用して並列プールを起動します。既定の基本設定で、既定のプールの場所はローカル マシンです。

parpool

ローカル マシン上のさまざまなタイプの並列環境で、プールを作成できます。

  • プロセス ワーカーの並列プールを起動します。

    parpool("Processes")
  • 4 つのスレッド ワーカーからなる並列プールを起動します。

    parpool("Threads",4)

並列環境の詳細については、スレッドベースの環境またはプロセスベースの環境の選択を参照してください。

myProf というプロファイルを使用して、16 個のワーカーからなる並列プールを起動します。

parpool("myProf",16)

既定のプロファイルで特定されたクラスターを表すオブジェクトを作成し、このクラスター オブジェクトを使用して並列プールを起動します。プールのサイズは既定のプロファイルによって決定されます。

c = parcluster
parpool(c)

既定のプロファイルを用いて並列プールを起動し、2 つのコード ファイルをワーカーに渡します。

parpool(AttachedFiles=["mod1.m","mod2.m"])

複数の 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"));

既定のプロファイルを用いて並列プールを作成し、その後でプールを削除します。

poolobj = parpool;

delete(poolobj)

現在の並列プールにあるワーカーの数を検出します。

poolobj = gcp("nocreate"); % If no pool, do not create new one.
if isempty(poolobj)
    poolsize = 0;
else
    poolsize = poolobj.NumWorkers
end

入力引数

すべて折りたたむ

並列プールのサイズ。正の整数、または整数の 2 要素ベクトルで指定された範囲として指定します。poolsize が範囲の場合、結果のプールのサイズは要求された範囲で最大になります。クラスター プロファイルで既定の推奨されるワーカー数を設定します。

parpool は、最大 2000 個のワーカーをもつプールをサポートします。 (R2024a 以降)

例: parpool("Processes",2)

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

起動するプールがあるリソース。"Processes""Threads"、クラスター プロファイル名またはクラスター オブジェクトとして指定します。

例: parpool("Processes")

例: parpool("Threads")

例: parpool("myClusterProfile",16)

例: c = parcluster; parpool(c)

データ型: char | string | parallel.Cluster

名前と値の引数

オプションの引数ペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a 以前は、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みました。

例: AttachedFiles="myFun.m"

プールに付加するファイル。文字ベクトル、string、string 配列、または文字ベクトルの cell 配列として指定します。

parpool はこの引数ペアを使用して並列プールを起動し、指定されたファイルをプールのワーカーに渡します。ここで指定したファイルは、所定の並列プロファイルで指定された AttachedFiles プロパティに追加され、付加ファイルの完全なリストが生成されます。AttachedFiles のプロパティ名は大文字小文字を区別するため、表示どおりに指定しなければなりません。

例: ["myFun.m","myFun2.m"]

データ型: char | cell

クライアント パスにユーザーが追加したエントリを、起動時に各ワーカーのパスに追加するかどうかを指定するフラグ。logical 値として指定します。

データ型: logical

クライアント セッションからワーカーにコピーされる環境変数名。文字ベクトル、string、string 配列、または文字ベクトルの cell 配列として指定します。ここで指定した名前は、該当する並列プロファイルで指定された EnvironmentVariables プロパティに追加され、環境変数の完全なリストが生成されます。リストされているが設定されていない変数はすべて、ワーカーにコピーされません。これらの環境変数は、並列プールの存在期間にわたってワーカーで設定されています。

データ型: char | cell

プールで spmd のサポートを有効にするかどうかを指定するフラグ。logical 値として指定します。サポートは、ローカル クラスターまたは MATLAB ジョブ スケジューラ クラスター上でのみ無効にできます。parfor の反復にワーカー間の通信は関与しません。したがって、SpmdEnabledfalse の場合、1 つ以上のワーカーが parfor ループの実行中に中止となってもループは続行します。

データ型: logical

プールがアイドルの場合にシャットダウンするまでの時間 (分単位)。ゼロより大きい整数として指定します。プールのワーカー上でコードが実行されていない場合、プールはアイドルです。IdleTimeout プロパティの値は、既定で並列基本設定の値と同じになります。並列基本設定の詳細については、並列基本設定の指定を参照してください。

例: pool = parpool(IdleTimeout=120)

出力引数

すべて折りたたむ

parallel.Pool オブジェクトとして返される、クライアントから並列プールへのアクセス。

ヒント

  • デスクトップの左下隅にあるプール ステータス インジケーターは、プールへのクライアント セッション接続とプールのステータスを表します。アイコンをクリックすると、サポートされているプール操作のメニューが表示されます。

    プールが実行中の場合: The parallel pool status indicator indicating that a pool is running, showing the start parallel pool and parallel preferences menu options. プールが実行中でない場合: The parallel pool status indicator indicating that no pool is running, showing the start parallel pool and parallel preferences menu options.

  • 並列基本設定で、必要に応じて並列プールを自動作成するよう設定されている場合、parpool コマンドを明示的に呼び出す必要はありません。プール セットアップ時のオーバーヘッド時間が発生するタイミングを制御する場合は、プールを明示的に作成し、そのプールを以降の並列言語構成で使用できます。

  • delete(poolobj) は並列プールをシャットダウンします。並列プールがない場合、spmdparfor はクライアント内でシングル スレッドとして実行されます。ただし、並列基本設定で並列プールが自動起動するよう設定されている場合を除きます。

  • MATLAB エディターを使用して、並列プールに付加されているファイルをクライアント上で更新すると、更新内容は自動的にプール内のワーカーに伝播されます(この自動更新は Simulink® モデル ファイルには適用されません。更新されたモデル ファイルをワーカーに伝播するには、関数 updateAttachedFiles を使用します)。

  • 可能な場合には、ワーカーの作業フォルダーは MATLAB クライアント セッションの作業フォルダーと一致するように初期設定されます。次に、以下のコマンドをクライアントのコマンド ウィンドウに入力すると、プールのすべてのワーカーでも実行されます。

    これによって、全ワーカー上で作業フォルダーとコマンド検索パスを設定でき、これ以降、parfor ループなどのプールのアクティビティが適切なコンテキストで実行されるようになります。

    Windows® オペレーティング システムを使用するクライアントで cd でフォルダーを変更したり、addpath でパスを追加したりする際にワーカーに送信される値は可能な限りフォルダーの UNC パスです。これは、Linux® オペレーティング システムを使用するクライアントではフォルダーの絶対位置になります。

    これらのコマンドがクライアントで機能しない場合、ワーカー上で実行されることはありません。たとえば、addpath でクライアントがアクセスできないフォルダーを指定した場合、この addpath コマンドはワーカーで実行されません。ただし、作業フォルダーがクライアント上では設定できても、いずれかのワーカーで指定どおりには設定できないという場合は、クライアントのコマンド ウィンドウにエラー メッセージは表示されません。

    クライアントとワーカーのプラットフォームが同じではない、クライアントのローカル フォルダーまたはクライアントからマッピングされたフォルダーがワーカーからは同じ方法で使用できない、あるいはフォルダーが非共有ファイル システムにあるといった混合プラットフォーム環境では、このわずかな動作の違いに注意してください。たとえば、MATLAB クライアントを Microsoft® Windows オペレーティング システムで実行している一方で、MATLAB ワーカーはすべて Linux オペレーティング システムで実行している場合、addpath の同じ引数は両方のオペレーティング システムでは機能しません。このような場合には、関数 pctRunOnAll を使用してコマンドがすべてのワーカーで実行されるようにできます。

    クライアントとワーカーのもう 1 つの違いは、matlabroot フォルダーの下位フォルダーを表す addpath 引数がワーカーには設定されないということです。MATLAB インストール ベースは既にワーカーのパスに含まれているということが、ここでは仮定されています。プール内のワーカーに関する addpath のルールは以下のとおりです。

    • matlabroot フォルダーのサブフォルダーはワーカーに送信されない。

    • matlabroot フォルダーの最初の出現箇所より前に現れるすべてのフォルダーは、ワーカーのパスの先頭に追加される。

    • matlabroot フォルダーの最初の出現箇所より後に現れるすべてのフォルダーは、ワーカーのパス上で matlabroot グループのフォルダーの後に追加される。

    たとえば、クライアントの matlabrootC:\Applications\matlab\ であるとします。開いている並列プールに対して以下を実行し、クライアントとすべてのワーカーにパスを設定します。

    addpath("P1",
            "P2",
            "C:\Applications\matlab\T3",
            "C:\Applications\matlab\T4",
            "P5",
            "C:\Applications\matlab\T6",
            "P7",
            "P8");

    T3T4 および T6matlabroot のサブフォルダーであるためワーカーのパスには設定されません。したがって、ワーカーに対し、このコマンドによって設定されるパスの該当部分は以下のとおりです。

    P1
    P2
    <worker original matlabroot folders...>
    P5
    P7
    P8
  • Macintosh または Linux を使用していて、大規模な並列プールの作成時に問題が発生した場合は、Macintosh と Linux で推奨されるシステムの制限を参照してください。

バージョン履歴

R2013b で導入

すべて展開する