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

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

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

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

Параллелизируйте for Циклы при помощи приложения MATLAB Coder

Чтобы включить автоматическую параллелизацию for циклы, в приложении MATLAB Coder™, на Generate Code шаге, выберите More Settings > Speed > Enable automatic parallelization.

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

Смотрите сгенерированные коды и инсайты кода

Откройте и проверьте отчет генерации кода.

Сгенерированный код

Наблюдайте прагмы открытой многопроцессорной обработки (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

Аналитика кода

На вкладке Code Insights, в разделе Automatic parallelization issues, можно увидеть подробную информацию о for циклы, которые не были параллелизированы в сгенерированном коде.

Для примера, чтобы просмотреть конкретное понимание кода, сгенерируйте код снова для autoparExample функцию, определенную в предыдущем разделе. Задайте меньший размер для входных параметров.

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

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

Code insights about non-parallelized part of the code

Отключение автоматической параллелизации for Цикл

Можно хотеть отключить автоматическую параллелизацию определенного цикла, если этот цикл работает лучше при последовательном выполнении. Чтобы предотвратить параллелизацию определенного for цикл, поместите coder.loop.parallelize('never') прагма непосредственно перед циклом в коде 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 Циклы

The функции , взятой в качестве примера, 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;
  }

Указания и ограничения по применению

См. также

| | | | |

Похожие темы