for Циклы в сгенерированном кодеИтерации параллельных for петли могут выполняться одновременно на нескольких ядрах на целевом оборудовании. Параллелизация раздела кода может значительно улучшить скорость выполнения сгенерированного кода. См. раздел Как циклы Parfor повышают скорость выполнения.
При создании кода C/C + + из кода MATLAB ® можно создавать параллельныеfor автоматически закольцовывается. Автоматическая параллелизация - это преобразование компилятора, которое преобразует последовательный код в многопоточный без ручного вмешательства.
Автоматическое распараллеливание for loop поддерживает эти типы построения для целевых объектов C/C + +: MEX, статическая библиотека, динамически связанная библиотека и исполняемый файл.
for Циклы с помощью приложения кодера MATLABВключение автоматического распараллеливания for в приложении MATLAB Coder™ на шаге Создать код выберите Дополнительные настройки > Скорость > Включить автоматическую распараллеливание.

for Контуры в командной строкеМожно включить параллелизацию for с помощью интерфейса командной строки. Рассмотрим функцию autoparExample:
function x = autoparExample(x) %#codegen for i = 10:numel(x) x(i) = sqrt(x(i)); end end
Автоматическое создание параллельного for циклы, выполните следующие команды:
cfg = coder.config('lib'); cfg.EnableAutoParallelization = 1; x = rand(1,2000); codegen -config cfg autoparExample -args {x} -report
Code generation successful: View reportОткройте и проверьте отчет о создании кода.
Ознакомьтесь с прагматиками Open Multi Processing (OpenMP), созданными над for петли.
void autoparExample(double x[2000])
{
int i;
if (!isInitialized_autoparExample) {
autoparExample_initialize();
}
#pragma omp parallel for num_threads(omp_get_max_threads()) private(i)
for (i = 0; i < 1991; i++) {
x[i + 9] = sqrt(x[i + 9]);
}
}Желоб, выделенный зеленым цветом рядом с контурами, показывает часть кода, которая является параллельной.

На вкладке Анализ кода в разделе Проблемы автоматического распараллеливания можно просмотреть подробную информацию о for петли, которые не были параллелизованы в сгенерированном коде.
Например, чтобы просмотреть определенный код, создайте код снова для autoparExample , которая была определена в предыдущем разделе. Укажите меньший размер для входных аргументов.
cfg = coder.config('lib'); cfg.EnableAutoParallelization = 1; x = rand(1,1000); codegen -config cfg autoparExample -args {x} -report
Созданный код не содержит параллельного for петли, поскольку размер входных аргументов меньше порогового значения для автоматического распараллеливания. Откройте отчет и щелкните Анализ кода > Проблемы автоматического распараллеливания, чтобы просмотреть подробную информацию о непараллелизированной части кода.

for ПетляМожно отключить автоматическую распараллеливание определенного цикла, если он работает лучше при последовательном выполнении. Предотвращение параллелизации определенного for петля, разместите coder.loop.parallelize('never') pragma непосредственно перед циклом в коде MATLAB. Эта прагматика переопределяет EnableAutoParallelization установка. Кроме того, эта прагматика поддерживает только те for контуры, явно определенные в коде MATLAB. Дополнительные сведения об явных и неявных циклах см. в следующем разделе.
Например, генератор кода не распараллеливает этот цикл:
% Pragma to disable automatic parallelization of for-loops coder.loop.parallelize('never'); for i = 1:n y(i) = y(i)*sin(i); end
Посмотрите coder.loop.parallelize.
for ПетлиПримерная функция autoparExample используемый в предыдущих разделах содержит явный for цикл. Но код MATLAB также может содержать неявные for циклы, которые явно не отображаются в созданном коде. Например, функция MATLAB mtimes умножает две матрицы и поэтому должен выполнять итерации цикла неявно над элементами матрицы.
Автоматическое распараллеливание поддерживает циклы, неявные для кода MATLAB. Например, рассмотрим эту функцию autoparExample_implicit.
function y = autoparExample_implicit(y) %#codegen y = y * 17; % Generates implicit for loop end
Создайте код, выполнив следующие команды:
cfg = coder.config('lib'); cfg.EnableAutoParallelization = 1; y = rand(1,2000); codegen -config cfg autoparExample_implicit -args {y} -report
Откройте отчет и проверьте созданный код. Сгенерированный код содержит параллельный цикл для операции умножения.
void autoparExample_implicit(double y[2000])
{
int i;
if (!isInitialized_autoparExample_implicit) {
autoparExample_implicit_initialize();
}
#pragma omp parallel for num_threads(omp_get_max_threads()) private(i)
for (i = 0; i < 2000; i++) {
y[i] *= 17.0;
}
Петли, содержащие постоянные переменные, не параллелизируются автоматически
Петли, содержащие внешние вызовы, не параллелизируются автоматически
Петли, выполняющие операции сокращения, не параллелизируются автоматически
Пустые петли и while петли не распараллелируются автоматически
coder.CodeConfig | coder.config | coder.EmbeddedCodeConfig | coder.loop.parallelize | coder.MexCodeConfig | parfor