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.
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]);
}
}
Желоб, выделенный зеленым цветом рядом с циклами, показывает часть кода, которая параллельна.
На вкладке 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, чтобы просмотреть подробную информацию о непараллельной части кода.
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;
}
Циклы, содержащие стойкие переменные, не параллелизируются автоматически
Циклы, содержащие внешние вызовы, не параллелизируются автоматически
Циклы, выполняющие операции сокращения, не параллелизируются автоматически
Пустые циклы и while
циклы не параллелизируются автоматически
coder.CodeConfig
| coder.config
| coder.EmbeddedCodeConfig
| coder.loop.parallelize
| coder.MexCodeConfig
| parfor