Main Content

移植可能な並列コードの作成

Parallel Computing Toolbox™ を使っている場合は自動的に並列リソースを使用し、Parallel Computing Toolbox がない場合でも実行される、移植可能な並列コードを作成することができます。

このトピックでは以下の方法について説明します。

  • Parallel Computing Toolbox なしで逐次実行される移植可能な並列コードを作成する。

  • Parallel Computing Toolbox なしであればバックグラウンドで実行され、Parallel Computing Toolbox がある場合はより多くの並列リソースを使用するコードを作成する。

  • Parallel Computing Toolbox なしであればバックグラウンドで実行され、Parallel Computing Toolbox がある場合はより多くの並列リソースを多く使用する、移植可能なカスタム並列コードを作成する。

Parallel Computing Toolbox なしでの並列コードの逐次実行

次の並列言語機能は、Parallel Computing Toolbox なしで逐次実行することができます。

Parallel Computing Toolbox がある場合に並列プールまたはクラスターを使用するよう設計された移植可能な並列コードを作成するには、自動並列サポートをもつ並列言語構文を使用します。これらの構文は、Parallel Computing Toolbox がない場合は逐次実行されます。

Parallel Computing Toolbox がない場合に自動的に逐次実行される移植可能な並列コードを作成する場合は、これらの言語機能にプール引数を指定しないでください。

ベスト プラクティスとしては、コードを実行する環境を指定する必要がある場合にのみ、Parallel Computing Toolbox の機能に対しプール引数を指定します。並列機能にプール引数を指定しない場合、機能は次のように実行されます。

  • 次のいずれかに該当する場合は、逐次実行される:

    • Parallel Computing Toolbox がない

    • 現在開いている並列プールがなく、プールの自動作成が有効になっていない

  • Parallel Computing Toolbox があり、次のいずれかに該当する場合は、並列プールで実行される:

    • 現在開いている並列プールがある

    • プールの自動作成が有効になっている

開いている並列プールがあり、プールの自動作成が有効である場合は、既定のクラスター プロファイルを使用してプールを開きます。既定のクラスター プロファイルの設定の詳細については、クラスターの検出とクラスター プロファイルの使用を参照してください。

magic(3) を非同期で実行して 1 つの出力を返すには、parfeval をプールなしで使用します。この関数は、Parallel Computing Toolbox がない場合は逐次実行されます。

f = parfeval(@magic,1,3)

magic を複数の行列サイズを使って実行するには、parfor ループをプールなしで使用します。このループは、Parallel Computing Toolbox がない場合は逐次実行されます。

parfor i = 1:10
    A{i} = magic(i);
end

Parallel Computing Toolbox なしで逐次実行される並列言語構文の詳細については、Run Parallel Language in Serialを参照してください。

backgroundPool を使って自動的にスケール アップ

Parallel Computing Toolbox がある場合、backgroundPool を使用するコードは自動的にスケール アップし、より多くの使用可能なコアを使います。

バックグラウンドにおける計算の自動スケール アップの詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。

バックグラウンド プールでの parfor ループの実行

parforOptions を使用して、parfor ループをバックグラウンド プールで実行することができます。

メモ

バックグラウンド プールを使用して parfor ループを実行すると、MATLAB® はループが終了するまで実行を一時停止します。コードはバックグラウンドで引き続き実行されるため、スレッドベースの環境でサポートされる機能のみを使用することができます。

parfeval および backgroundPool を使用してバックグラウンドで複数の関数を実行する場合、コードはより多くの使用可能なコアを使うようスケール アップします。parfeval を使用して、rand をバックグラウンドで 20 回使用します。

for i = 1:20   
    f(i) = parfeval(backgroundPool,@rand,1);
end

parfor ループをバックグラウンドで実行するには、backgroundPoolparforOptions のプール引数として指定し、その結果を parforopts 引数として使用します。

parfor (loopVal = initVal:endVal, parforOptions(backgroundPool))
    statements
end

移植可能なカスタム並列コードの作成

Parallel Computing Toolbox がある場合に、自動的に並列リソースを使用できる移植可能な並列コードを作成する場合、移植可能な並列コードの作成には以下の制限があります。

  • 自動的に ThreadPool を起動して並列コードを実行することはできない

  • Parallel Computing Toolbox がない場合はコードが逐次実行される

以下の関数 selectPool は、バックグラウンド プールまたは並列プールを返します。parfevalparforOptions などの並列言語機能と共に、selectPool をプール引数として使用することができます。Parallel Computing Toolbox があり、並列プールの自動作成が有効になっている場合、この関数は並列プールを返します。それ以外の場合は、バックグラウンド プールを返します。

function pool = selectPool
    if canUseParallelPool
        pool = gcp;
    else
        pool = backgroundPool;
    end
end