生成コードで並列 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 ループの自動並列化を参照してください。
スレッド数の指定
CPU スレッドの最大数を指定するには、次のいずれかの方法を使用します。
コード構成オブジェクトで、
EnableAutoParallelizationプロパティをtrueに設定し、NumberOfCpuThreadsプロパティの値を指定する。[コード生成設定] ダイアログ ボックスで、[自動並列化を有効にする] チェック ボックスをオンにし、[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 ループを使用します。EnableAutomaticParallelization
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.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'); 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.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.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