Main Content

coder.loop.parallelize

生成コードで特定の for ループを並列化 (自動並列化を無効化)

R2021a 以降

    説明

    coder.loop.parallelize('never') は、その直後に配置された for ループの自動並列化を無効にします。このプラグマは、EnableAutoParallelization 構成設定をオーバーライドします。

    このプラグマは、明示的な for ループのみをサポートします。明示的なループと暗黙的なループの詳細については、暗黙的な for ループの並列化を参照してください。

    coder.loop.parallelize("loopID") は、インデックス名が loopID である for ループを並列化します。

    これにより、生成コードにおいて、そのループの反復がターゲットに使用可能なスレッドで並列実行されます。この変換のためには、コード構成オブジェクトで EnableOpenMPtrue に設定する必要があります。

    ループの最適化の詳細については、Optimize Loops in Generated Codeを参照してください。

    loopObj = coder.loop.parallelize(___) は、transformSchedule プロパティが coder.loop.parallelize に設定されたループ制御オブジェクトを作成します。指定したループへの変換の適用には apply メソッドを使用します。

    すべて折りたたむ

    この例では、coder.loop.parallelize('never') 命令を使用して MATLAB® コードで特定の for ループの自動並列化を無効にする方法を示します。

    MATLAB 関数 autoparExample を定義します。

    function [x, y] = autoparExample(x, y) %#codegen
    x = x * 17;
    % Pragma to disable automatic parallelization of for-loops
    coder.loop.parallelize('never');
    for i = 10:numel(x)
        y(i) = sqrt(y(i));
    end
    end

    この関数には次の 2 つのループが含まれています。

    • 関数 mtimes (行列乗算) に、行列 x の要素を反復する暗黙的な for ループが含まれています。

    • 行列 y の要素のサブセットの平方根を計算する明示的な for ループ。coder.loop.parallelize('never') 命令は、このループの自動並列化を無効にします。

    スタティック ライブラリ用のコード生成構成オブジェクトを作成します。EnableAutoParallelization プロパティを true に設定します。入力の型を double の 1 行 2000 列の行ベクトルとして指定し、コードを生成します。

    cfg = coder.config('lib');
    cfg.EnableAutoParallelization = 1;
    codegen -config cfg autoparExample -args {rand(1,2000) rand(1,2000)} -report
    Code generation successful: View report

    コード生成レポートを開き、生成された関数 autoparExample を検査します。

    • 生成されたコードには、乗算演算の並列ループが含まれています。

    • 明示的な for ループが生成されたコード内でシリアル ループに変換されます。MATLAB コードでは、このループの前に coder.loop.parallelize('never') 命令がありました。これはコード ジェネレーターで並列化されていません。

    void autoparExample(double x[2000], double y[2000])
    {
      int b_i;
      int i;
      if (!isInitialized_autoparExample) {
        autoparExample_initialize();
      }
    #pragma omp parallel for num_threads(omp_get_max_threads()) private(i)
    
      for (i = 0; i < 2000; i++) {
        x[i] *= 17.0;
      }
      /*  Pragma to disable automatic parallelization of for-loops */
      for (b_i = 0; b_i < 1991; b_i++) {
        y[b_i + 9] = sqrt(y[b_i + 9]);
      }
    }

    関数 coder.loop.parallelize を MATLAB コードで使用して、生成コードで特定の for ループを並列化するように選択できます。

    MATLAB 関数 forLoopFuncParallel を定義します。この関数内で、並列化する for ループのインデックスを指定して coder.loop.parallelize を呼び出します。さらに、関数を呼び出して特定のループを並列化しないようにします。

    function [out1,out2] = forLoopFuncParallel
    out1 = ones(1,100);
    out2 = zeros(1,100);
    
    coder.loop.parallelize("i");
    for i = 1:100
        out1(i) = out1(i) * i;
    end
    
    coder.loop.parallelize("j");
    for j = 1:100
        out2(j) = out2(j) + j;
    end

    この関数のコードを次のコマンドを実行して生成します。

    codegen forLoopFuncParallel -config:lib -launchreport

    コード生成レポートで生成コードを検査します。コード ジェネレーターで OpenMP を使用してループが並列化されていることに注目してください。

    void forLoopFuncParallel(double out1[100], double out2[100])
    {
      int i;
      int j;
      if (!isInitialized_forLoopFuncParallel) {
        forLoopFuncParallel_initialize();
      }
      for (j = 0; j < 100; j++) {
        out1[j] = 1.0;
        out2[j] = 0.0;
      }
    #pragma omp parallel for num_threads(omp_get_max_threads())
    
      for (i = 0; i < 100; i++) {
        out1[i] *= (double)i + 1.0;
      }
      for (j = 0; j < 100; j++) {
        out2[j] += (double)j + 1.0;
      }
    }

    入力引数

    すべて折りたたむ

    並列化する for ループの識別子またはインデックス名。文字ベクトルまたは string スカラーとして指定します。

    データ型: char | string

    出力引数

    すべて折りたたむ

    transformSchedule プロパティが coder.loop.parallelize に設定されたループ制御オブジェクト。

    拡張機能

    C/C++ コード生成
    MATLAB® Coder™ を使用して C および C++ コードを生成します。

    GPU コード生成
    GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

    バージョン履歴

    R2021a で導入