for
- Циклы в сгенерированном кодеИспользуя MATLAB® Coder™, можно задать максимальное количество потоков, чтобы идти параллельно for
- циклы в сгенерированном коде C/C++. Можно также кросс-скомпилировать код, то есть, сгенерировать код по аппаратному процессору хоста и выполнить его на процессоре целевого компьютера. В зависимости от платформы целевого компьютера можно задать количество потоков.
Можно определить номер потоков в сгенерированном коде по-разному. Таблица приводит эти опции с их порядком приоритета. Приоритет определяет порядок выполнения этих опций, в которых MATLAB Coder определяет номер потоков. Если значение этих опций равняется их значению по умолчанию, порядок приоритета перемещен в следующую перечисленную в таблице опцию.
Если вы не устанавливаете ни одной из этих опций, то по умолчанию сгенерированный параллельный код использует максимальное количество потоков, доступных на целевом компьютере в течение времени выполнения. Это использование максимального количества потоков включено Открытой Многопроцессорной обработкой (OpenMP) прагму omp_get_max_threads
в сгенерированном коде.
Приоритет | Опции, чтобы определить номер потоков | Команды, чтобы определить номер потоков |
---|---|---|
1 | Parfor-loop with number of threads specified |
% u specifies the maximum number of threads parfor (i = 1:10, u) |
2 | Configuration property (default value = 0):
|
cfg.NumberOfCpuThreads = 8; |
3 | Target processor properties (default value = 1):
|
processor.NumberOfCores = 4; processor.NumberOfThreadsPerCore = 2; |
Примечание
Если NumberOfCpuThreads
равняется 1, затем Automatic parallelization of for-loop отключен. Смотрите Автоматически Параллелизируют циклы for в Сгенерированном коде.
Установить Maximum number of CPU threads:
Откройте приложение MATLAB Coder.
В окне Generate Code нажмите More Settings.
Во вкладке Speed введите Maximum number of CPU threads.
Значение Maximum number of CPU threads применяется к parfor
- циклы и автоматически параллелизированный for
- циклы включены установкой Enable automatic parallelization.
Рассмотрите эти функции 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
- цикл.
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