メインコンテンツ

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]);
      }
    }

    MATLAB コード内の coder.loop.parallelize 関数を使用して、生成されたコードで特定の for ループを並列化することを選択できます。

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

    type forLoopFuncParallel
    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","never");
    for j = 1:100
        out2(j) = out2(j) + j;
    end
    

    コマンド ラインでこの関数のコードを生成します。

    codegen forLoopFuncParallel -config:lib
    Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
    Embedded Coder is not installed, this might cause some Embedded Coder features
    to fail.
    
    
    Code generation successful (with warnings): View report
    

    生成されたコードを検証します。コード ジェネレーターは OpenMP を使用してループを並列化します。

    type(fullfile("codegen","lib","forLoopFuncParallel","forLoopFuncParallel.c"))
    /*
     * File: forLoopFuncParallel.c
     *
     * MATLAB Coder version            : 25.1
     * C/C++ source code generated on  : 13-Jul-2025 17:34:56
     */
    
    /* Include Files */
    #include "forLoopFuncParallel.h"
    #include "forLoopFuncParallel_data.h"
    #include "forLoopFuncParallel_initialize.h"
    #include "omp.h"
    #include <emmintrin.h>
    
    /* Function Definitions */
    /*
     * Arguments    : double out1[100]
     *                double out2[100]
     * Return Type  : void
     */
    void forLoopFuncParallel(double out1[100], double out2[100])
    {
      double dv[2];
      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 <= 98; j += 2) {
        __m128d r;
        __m128d r1;
        dv[0] = j;
        dv[1] = (double)j + 1.0;
        r = _mm_loadu_pd(&dv[0]);
        r1 = _mm_loadu_pd(&out2[j]);
        _mm_storeu_pd(&out2[j], _mm_add_pd(r1, _mm_add_pd(r, _mm_set1_pd(1.0))));
      }
    }
    
    /*
     * File trailer for forLoopFuncParallel.c
     *
     * [EOF]
     */
    

    入力引数

    すべて折りたたむ

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

    データ型: char | string

    出力引数

    すべて折りたたむ

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

    拡張機能

    すべて展開する

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

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

    バージョン履歴

    R2021a で導入