Main Content

生成コードで並列 for ループを実行するための最大スレッド数の指定

MATLAB® Coder™ を使用して、生成された C/C++ コードで並列 for ループを実行するための最大スレッド数を指定できます。コードのクロスコンパイル、つまり、ホスト ハードウェアのプロセッサでコードを生成してターゲット ハードウェアのプロセッサで実行することも可能です。ターゲット ハードウェアのプラットフォームに応じてスレッド数を指定できます。

生成コードにおけるスレッド数はさまざまな方法で設定できます。それらのオプションとその優先順位を次の表に示します。優先順位により、MATLAB Coder でスレッド数を設定する際の各オプションの実行順序が決まります。これらのオプションの値が既定値と等しい場合、表に記載された次のオプションに優先順位が移ります。

これらのいずれのオプションも設定していない場合、既定では、実行時にターゲット ハードウェアで使用可能な最大数のスレッドが生成された並列コードで使用されます。この最大数のスレッドの使用は、生成コードの Open Multiprocessing (OpenMP) プラグマ omp_get_max_threads で有効化されます。

優先順位スレッド数を設定するオプションスレッド数を設定するコマンド
1

Parfor ループでのスレッド数の指定

% u specifies the maximum number of threads 
parfor (i = 1:10, u)
2

構成プロパティ (既定値 = 0):

NumberOfCpuThreads

cfg.NumberOfCpuThreads = 8;
3

ターゲット プロセッサのプロパティ (既定値 = 1):

NumberOfCores,

NumberofThreadsPerCore

processor.NumberOfCores = 4; 
processor.NumberOfThreadsPerCore = 2;

メモ

NumberOfCpuThreads が 1 と等しい場合、"for ループの自動並列化" は無効になります。生成コードでの for ループの自動並列化を参照してください。

MATLAB Coder アプリを使用したスレッド数の指定

[CPU スレッドの最大数] を設定するには、次のようにします。

  1. MATLAB Coder アプリを開きます。

  2. [コード生成] ウィンドウで、[詳細設定] をクリックします。

  3. [速度] タブで、[CPU スレッドの最大数] を入力します。

[CPU スレッドの最大数] の値は、parfor ループと [自動並列化を有効にする] 設定で有効化された自動並列化 for ループに適用されます。

GUI for Maximum number of CPU threads

コマンド ラインでのスレッド数の指定

次の MATLAB 関数 parforExample および autoparExample について考えます。

関数 parforExample では、最大スレッド数が 6 に設定された parfor ループを使用します。

function y = parforExample(n) %#codegen
    y = ones (1,n); 
    parfor (i = 1:n, 6) 
        y(i) = 1; 
    end 
end

関数 autoparExample では、for ループを使用します。

function y = autoparExample(n) %#codegen
    y = ones (1,n); 
    for i = 1:n 
        y(i) = 1; 
    end 
end

上記で指定した MATLAB 関数を使用して、生成された並列コードでのスレッド数を設定するさまざまな例を次の表に示します。

コードを生成するコマンド説明生成コード
n = 1000;
cfg = coder.config('lib');
cfg.NumberOfCpuThreads = 8;

codegen –config cfg ...
parforExample –args {n} -report

Parfor ループで最大スレッド数が 6 に設定されます。

#pragma omp parallel for num_threads(
    6 > omp_get_max_threads() ? omp_get_max_threads() : 6)

for (i = 0; i <= ub_loop; i++) {
    y_data[i] = 1.0;
}
n = 1000;
cfg = coder.config('lib');
cfg.EnableAutoParallelization = true;
cfg.NumberOfCpuThreads = 8;

codegen –config cfg ...
autoparExample –args {n} -report

構成プロパティで最大スレッド数が 8 に設定されます。

#pragma omp parallel for num_threads(
    8 > omp_get_max_threads() ? omp_get_max_threads() : 8)

for (b_i = 0; b_i < i; b_i++) {
    y_data[b_i] = 1.0;
}
n = 1000;
cfg = coder.config('lib');
cfg.EnableAutoParallelization = true;

codegen –config cfg ...
autoparExample –args {n} -report

最大スレッド数が omp_get_max_threads() に設定されます。

#pragma omp parallel for num_threads(omp_get_max_threads())

for (b_i = 0; b_i < i; b_i++) {
    y_data[b_i] = 1.0;
}

カスタム ハードウェアのプロセッサの作成

ターゲット プロセッサを追加するには、次のようにします。

  1. 既存のターゲット プロセッサのコピーを作成します。

    processor = target.get('Processor', 'ARM Compatible-ARM Cortex-A');
  2. 新しいプロセッサのコア数、コアあたりのスレッド数、および名前を更新します。

    processor.NumberOfCores = 4;
    processor.NumberOfThreadsPerCore = 2;
    processor.Name = '4coreprocessor';
  3. target.Processor オブジェクトを内部データベースに追加します。

    target.add(processor);
  4. 新しいプロセッサをターゲット プロセッサとして選択します。

    cfg = coder.config('lib');
    cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->4coreprocessor';

MATLAB Coder アプリで、target.get クラスおよび target.add クラスを使用して、コマンド ラインで作成したカスタム ハードウェアのプロセッサを選択できます。

代わりに、target.Processor クラスおよび target.LanguageImplementation クラスを使用してターゲット プロセッサを作成することもできます。詳細については、新しいハードウェア デバイスの登録を参照してください。

コードを生成するコマンド説明生成コード
n = 1000;
cfg = coder.config('lib');
cfg.EnableAutoParallelization = true;
cfg.HardwareImplementation.ProdHWDeviceType ...
    ... = "ARM Compatible->4coreprocessor";

codegen –config cfg autoparExample –args {n} -report

ターゲット プロセッサで最大スレッド数が 4 に設定されます。

#pragma omp parallel for num_threads(
4 > omp_get_max_threads() ? omp_get_max_threads() : 4)
for (b_i = 0; b_i < i; b_i++) {
y_data[b_i] = 1.0;
}
n = 1000;
cfg = coder.config('lib');
cfg.EnableAutoParallelization = true;
cfg.NumberOfCpuThreads = 2;
cfg.HardwareImplementation.ProdHWDeviceType ...
    ... = "ARM Compatible->4coreprocessor";

codegen –config cfg autoparExample –args {n} -report

構成プロパティで最大スレッド数が 2 に設定されます。

#pragma omp parallel for num_threads(
2 > omp_get_max_threads() ? omp_get_max_threads() : 2)
for (b_i = 0; b_i < i; b_i++) {
y_data[b_i] = 1.0;
}

参考

| | | | |

関連するトピック