生成コードで並列 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): | cfg.NumberOfCpuThreads = 8; |
3 | ターゲット プロセッサのプロパティ (規定値 = 1): | processor.NumberOfCores = 4; processor.NumberOfThreadsPerCore = 2; |
メモ
NumberOfCpuThreads
が 1 と等しい場合、"for ループの自動並列化" は無効になります。生成コードでの for ループの自動並列化を参照してください。
MATLAB Coder アプリを使用したスレッド数の指定
[CPU スレッドの最大数] を設定するには、次のようにします。
MATLAB Coder アプリを開きます。
[コード生成] ウィンドウで、[詳細設定] をクリックします。
[速度] タブで、[CPU スレッドの最大数] を入力します。
[CPU スレッドの最大数] の値は、parfor
ループと [自動並列化を有効にする] 設定で有効化された自動並列化 for
ループに適用されます。
コマンド ラインでのスレッド数の指定
次の 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 |
| #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 | 最大スレッド数が | #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;
} |
カスタム ハードウェアのプロセッサの作成
ターゲット プロセッサを追加するには、次のようにします。
既存のターゲット プロセッサのコピーを作成します。
processor = target.get('Processor', 'ARM Compatible-ARM Cortex-A');
新しいプロセッサのコア数、コアあたりのスレッド数、および名前を更新します。
processor.NumberOfCores = 4; processor.NumberOfThreadsPerCore = 2; processor.Name = '4coreprocessor';
target.Processor
オブジェクトを内部データベースに追加します。target.add(processor);
新しいプロセッサをターゲット プロセッサとして選択します。
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;
} |
参考
parfor
| coder.config
| coder.MexCodeConfig
| coder.CodeConfig
| coder.EmbeddedCodeConfig
| target