Main Content

parfor

for ループを並列化する

説明

parfor LoopVar = InitVal:EndVal; Statements; end は、共有メモリ マルチコア プラットフォームで並列実行される、生成された MEX 関数または C/C++ コード内にループを作成します。

parfor ループは、LoopVar の値 InitValEndvalStatements を実行します。LoopVar は 1 ずつ増加する整数値のベクトルを指定します。

parfor (LoopVar = InitVal:EndVal, NumThreads); Statements; end は、並列 for ループの作成に際して最大で NumThreads のスレッドを使用します。

すべて折りたたむ

使用可能な最大コア数で実行する parfor ループの MEX 関数を生成します。

parfor ループで高速フーリエ変換関数 fft を呼び出す MATLAB® 関数 test_parfor を記述します。ループの反復が並列実行されるので、この評価は類似の for ループよりもずっと早く完了する可能性があります。

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

test_parfor の MEX 関数を生成します。MATLAB コマンド ラインで次のように入力します。

codegen test_parfor

codegen は現在のフォルダーに MEX 関数 test_parfor_mex を生成します。

MEX 関数を実行します。MATLAB コマンド ラインで次のように入力します。

test_parfor_mex

MEX 関数は使用可能なコアを使用して実行されます。

parfor ループの MEX 関数を生成する際の最大スレッド数を指定します。

入力 u を使用する MATLAB 関数 specify_num_threads を記述して、parfor ループにおけるスレッドの最大数を指定します。

function y = specify_num_threads(u) %#codegen
  y = ones(1,100);
  % u specifies maximum number of threads
  parfor (i = 1:100,u)
    y(i) = i;
  end
end

specify_num_threads の MEX 関数を生成します。-args 0 を使用して入力の型を指定します。MATLAB コマンド ラインで次のように入力します。

% -args 0 specifies that input u is a scalar double
% u is typecast to an integer by the code generator
codegen -report specify_num_threads -args 0

codegen は現在のフォルダーに MEX 関数 specify_num_threads_mex を生成します。

最大 4 つのスレッド上で並列実行するように指定して、MEX 関数を実行します。MATLAB コマンド ラインで次のように入力します。

specify_num_threads_mex(4)

生成された MEX 関数は最大 4 つのコアで実行されます。使用可能なコア数が 4 未満の場合、MEX 関数は呼び出し時に使用できる最大コア数で実行されます。

parfor ループの MEX 関数を生成する前に、並列処理を無効にします。

parfor ループで高速フーリエ変換関数 fft を呼び出す MATLAB 関数 test_parfor を記述します。

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

test_parfor の MEX 関数を生成します。複数のスレッドで実行できる MEX 関数を codegen が生成しないように、OpenMP の使用を無効にします。

codegen -O disable:OpenMP test_parfor

codegen は現在のフォルダーに MEX 関数 test_parfor_mex を生成します。

MEX 関数を実行します。

test_parfor_mex

MEX 関数は単一のスレッドで実行されます。

並列処理を無効にすると、MATLAB Coder™parfor ループを for ループとして扱います。ソフトウェアは単一のスレッドで実行される MEX 関数を生成します。並列処理を無効にして、生成された MEX 関数または C/C++ コードの逐次バージョンと並列バージョンのパフォーマンスを比較します。また、並列処理を無効にして、並列バージョンの問題をデバッグすることもできます。

入力引数

すべて折りたたむ

初期値が InitVal、最終値が EndVal のループ インデックス変数。

ループ インデックス変数 Loopvar の初期値。EndValparfor の範囲ベクトルを指定する場合は、M:N の形式にしなければなりません。

ループ インデックス変数 LoopVar の最終値。InitValparfor の範囲ベクトルを指定する場合は、M:N の形式にしなければなりません。

parfor ループで実行する一連の MATLAB コマンド。

同一行に 1 つを超えるステートメントを含める場合、ステートメントをセミコロンで区切ります。以下に例を示します。

parfor i = 1:10
 arr(i) = rand(); arr(i) = 2*arr(i)-1;
end

使用する最大スレッド数。上限を指定すると、MATLAB Coder は、追加のコアを使用できる場合でもこの上限値以下しか使用しません。使用可能なコア数以上のスレッドを要求すると、MATLAB Coder は呼び出し時に使用できる最大コア数を使用します。スレッド数よりループ反復数が少ない場合、一部のスレッドは処理を行いません。

parfor ループが複数のスレッドで実行できない場合 (たとえば、1 つのコアしか使用できないか、NumThreads が 0 の場合)、MATLAB Coder は逐次方式でループを実行します。

制限

  • Open Multiprocessing (OpenMP) アプリケーション インターフェイスをサポートするコンパイラを使用しなければなりません。サポートされるコンパイラを参照してください。OpenMP をサポートしていないコンパイラを使用する場合は、MATLAB Coderparfor ループを for ループとして扱います。生成された MEX 関数または C/C++ コードでは、ループ反復は単一スレッドで実行されます。

  • OpenMP アプリケーション インターフェイスは JIT MEX コンパイルと互換性がありません。JIT コンパイルが OpenMP をサポートしないを参照してください。

  • parfor ループ内では以下の構造を使用しないでください。

    • parfor ループの本体で coder.extrinsic を使用して外部関数を呼び出すことはできません。

    • parfor ループ内でグローバル変数を書き込むことはできません。

    • MATLAB Coder は、リダクション内の coder.ceval の使用をサポートしません。たとえば、次の parfor ループのコードを生成できません。

      parfor i = 1:4
        y = coder.ceval('myCFcn',y,i);
      end
      代わりに、coder.ceval を使用して C コードを呼び出すローカル関数を記述し、この関数を parfor ループ内で呼び出します。以下に例を示します。
      parfor i = 1:4
        y = callMyCFcn(y,i);
      end
      function y = callMyCFcn(y,i)
       y = coder.ceval('mCyFcn', y , i);
      end

    • varargin または varargoutparfor ループで使用できません。

  • ループ インデックスの型は、ターゲット ハードウェアにおいて整数型で表現可能でなければなりません。生成されたコード内でマルチワード タイプを必要としない型を使用してください。

  • スタンドアロン コード生成の parfor では、実行可能ファイルまたはライブラリのビルドにツールチェーン アプローチが必要です。コード ジェネレーターでテンプレート makefile アプローチを使用する原因となるような設定変更は行わないでください。プロジェクトまたは構成でテンプレート makefile を使用を参照してください。

  • MATLAB コードで parfor を使用するには、Parallel Computing Toolbox™ のライセンスが必要です。

制限の包括的な一覧は、parfor の制限を参照してください。

ヒント

  • 以下の場合、parfor ループを使用します。

    • 簡単な計算のループによる反復が多数必要である。parfor はループの反復をグループに分け、各スレッドで 1 つのグループの反復が実行されるようにします。

    • 実行に長時間かかるループ反復がある場合。

  • ループの反復が他の反復の結果によって変わる場合は、parfor ループを使用しないでください。

    リダクションはこのルールの例外です。"リダクション変数" は、すべての反復に同時に依存するが反復順序には依存しない値を累積します。

  • 入力引数 NumThreads は生成コードにおいて OpenMP の num_threads() 句を設定します。OpenMP では、環境変数 OMP_NUM_THREADS を設定するか omp_set_num_threads() を使用することで、C/C++ におけるスレッドの数のグローバルな制限もサポートされます。詳細については、OpenMP の仕様 (https://www.openmp.org/specifications/) を参照してください。

バージョン履歴

R2012b で導入