exponenta event banner

Автоматическая параллелизация for Циклы в сгенерированном коде

Итерации параллельных for петли могут выполняться одновременно на нескольких ядрах на целевом оборудовании. Параллелизация раздела кода может значительно улучшить скорость выполнения сгенерированного кода. См. раздел Как циклы Parfor повышают скорость выполнения.

При создании кода C/C + + из кода MATLAB ® можно создавать параллельныеfor автоматически закольцовывается. Автоматическая параллелизация - это преобразование компилятора, которое преобразует последовательный код в многопоточный без ручного вмешательства.

Автоматическое распараллеливание for loop поддерживает эти типы построения для целевых объектов C/C + +: MEX, статическая библиотека, динамически связанная библиотека и исполняемый файл.

Найти что-либо подобное for Циклы с помощью приложения кодера MATLAB

Включение автоматического распараллеливания for в приложении MATLAB Coder™ на шаге Создать код выберите Дополнительные настройки > Скорость > Включить автоматическую распараллеливание.

GUI for Enable Automatic Parallelization

Найти что-либо подобное 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]);
  }
}

Желоб, выделенный зеленым цветом рядом с контурами, показывает часть кода, которая является параллельной.

Highlighted parallel for loops

Анализ кода

На вкладке Анализ кода в разделе Проблемы автоматического распараллеливания можно просмотреть подробную информацию о for петли, которые не были параллелизованы в сгенерированном коде.

Например, чтобы просмотреть определенный код, создайте код снова для autoparExample , которая была определена в предыдущем разделе. Укажите меньший размер для входных аргументов.

cfg = coder.config('lib');
cfg.EnableAutoParallelization = 1;
x = rand(1,1000);
codegen -config cfg autoparExample -args {x} -report

Созданный код не содержит параллельного for петли, поскольку размер входных аргументов меньше порогового значения для автоматического распараллеливания. Откройте отчет и щелкните Анализ кода > Проблемы автоматического распараллеливания, чтобы просмотреть подробную информацию о непараллелизированной части кода.

Code insights about non-parallelized part of the code

Отключить автоматическую параллелизацию 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;
  }

Примечания и ограничения по использованию

См. также

| | | | |

Связанные темы