指定在生成的代码中运行并行 for 循环的最大线程数
使用 MATLAB® Coder™,您可以指定在生成的 C/C++ 代码中运行并行 for 循环的最大线程数。您还可以交叉编译代码,即在主机硬件处理器上生成代码并在目标硬件处理器上执行生成的代码。根据目标硬件平台,您可以指定线程数。
您可以通过不同方式设置生成代码中的线程数。下表列出了这些选项及其优先顺序。优先级确定 MATLAB Coder 在其中设置线程数的这些选项的执行顺序。如果这些选项的值等于其默认值,则优先顺序移至表中的下一个选项。
如果您未设置其中任一选项,则默认情况下,生成的并行代码在运行时使用目标硬件上可用的最大线程数。通过 Open Multiprocessing (OpenMP) pragma 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 循环的自动并行化禁用。请参阅Automatic Parallelization of for-Loops in the Generated Code。
指定线程数
要指定最大 CPU 线程数,请使用以下方法之一:
在代码配置对象中,将
EnableAutoParallelization属性设置为true并为NumberOfCpuThreads属性指定值。在“代码生成设置”对话框中,选中启用自动并行化复选框并输入最大 CPU 线程数参数的值。
您配置的最大 CPU 线程数将应用于 parfor 循环和自动并行化的 for 循环。
例如,假设有以下 MATLAB 函数 parforExample 和 autoparExample。
parforExample 函数使用 parfor 循环,最大线程数设置为 6。
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 类创建一个目标处理器。有关详细信息,请参阅Register New Hardware Devices。
| 用于生成代码的命令 | 描述 | 生成的代码 |
|---|---|---|
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