Задайте максимальное количество потоков, чтобы идти параллельно 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):

NumberOfCpuThreads

cfg.NumberOfCpuThreads = 8;
3

Target processor properties (default value = 1):

NumberOfCores,

NumberofThreadsPerCore

processor.NumberOfCores = 4; 
processor.NumberOfThreadsPerCore = 2;

Примечание

Если NumberOfCpuThreads равняется 1, затем Automatic parallelization of for-loop отключен. Смотрите Автоматически Параллелизируют циклы for в Сгенерированном коде.

Задайте количество потоков при помощи приложения MATLAB Coder

Установить Maximum number of CPU threads:

  1. Откройте приложение MATLAB Coder.

  2. В окне Generate Code нажмите More Settings.

  3. Во вкладке Speed введите Maximum number of CPU threads.

Значение Maximum number of CPU threads применяется к parfor- циклы и автоматически параллелизированный for- циклы включены установкой Enable automatic parallelization.

GUI for Maximum number of CPU threads

Задайте количество потоков в командной строке

Рассмотрите эти функции 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

Parfor- цикл определяет максимальный номер потоков к 6.

#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

Максимальный номер потоков определяется к omp_get_max_threads().

#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;
}

Создайте процессор специального оборудования

Добавить целевой процессор:

  1. Создайте копию существующего целевого процессора.

    processor = target.get('Processor', 'ARM Compatible-ARM Cortex-A');
  2. Обновите количество ядер, количество потоков на ядро и имя нового процессора.

    processor.NumberOfCores = 4;
    processor.NumberOfThreadsPerCore = 2;
    processor.Name = '4coreprocessor';
  3. Добавьте target.Processor возразите против внутренней базы данных.

    target.add(processor);
  4. Выберите новый процессор как целевой процессор.

    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;
}

Смотрите также

| | | | |

Похожие темы