parfor

Параллельные for- цикл

Описание

пример

parfor LoopVar = InitVal:EndVal; Statements; end создает цикл в сгенерированной MEX-функции или в коде C/C + +, который запускается параллельно на многоядерных платформах с общей памятью.

The parfor-цикл выполняет Statements для значений LoopVar между InitVal и Endval. LoopVar задает вектор целочисленных значений, увеличивающийся на 1.

пример

parfor (LoopVar = InitVal:EndVal, NumThreads); Statements; end использует максимум NumThreads потоки при создании параллельного for-цикл.

Примеры

свернуть все

Сгенерируйте MEX-функцию для parfor-цикл, для выполнения с максимальным количеством доступных ядер.

Написание MATLAB® функция, test_parfor, который вызывает функцию быстрого преобразования Фурье, fft, в parfor-цикл. Поскольку итерации цикла выполняются параллельно, эта оценка может быть завершена намного быстрее, чем аналогичная for-цикл.

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

Сгенерируйте MEX-функцию для test_parfor. В командной строке MATLAB введите:

codegen test_parfor

codegen генерирует MEX-функцию, test_parfor_mex, в текущей папке.

Запустите MEX-функцию. В командной строке MATLAB введите:

test_parfor_mex

MEX-функция запусков с использованием доступных ядер.

Задайте максимальное количество потоков при генерации MEX-функции для parfor-цикл.

Написание функции MATLAB, specify_num_threads, который использует вход, u, чтобы задать максимальное количество потоков в parfor-цикл.

function y = specify_num_threads(u) %#codegen
  y = ones(1,100);
  % u specifies maximum number of threads
  parfor (i = 1:100,u)
    y(i) = i;
  end
end

Сгенерируйте MEX-функцию для specify_num_threads. Использование -args 0 для определения типа входа. В командной строке MATLAB введите:

% -args 0 specifies that input u is a scalar double
% u is typecast to an integer by the code generator
codegen -report specify_num_threads -args 0

codegen генерирует MEX-функцию, specify_num_threads_mex, в текущей папке.

Запустите MEX-функцию, указав, что он запускается параллельно самое большее в четырех потоках. В командной строке MATLAB введите:

specify_num_threads_mex(4)

Сгенерированная MEX-функция работает до четырех ядер. Если доступно менее четырех ядер, MEX-функция выполняется на максимальном количестве ядер, доступном во время вызова.

Отключите параллелизацию перед генерацией MEX-функции для parfor-цикл.

Написание функции MATLAB, test_parfor, который вызывает функцию быстрого преобразования Фурье, fft, в parfor-цикл.

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

Сгенерируйте MEX-функцию для test_parfor. Отключите использование OpenMP, чтобы codegen не генерирует MEX-функцию, которая может запускаться в нескольких потоках.

codegen -O disable:OpenMP test_parfor

codegen генерирует MEX-функцию, test_parfor_mex, в текущей папке.

Запустите MEX-функцию.

test_parfor_mex

MEX-функция выполняется в одном потоке.

Если вы отключаете параллелизацию, MATLAB Coder™ обрабатывает parfor-циклы как for-циклы. Программное обеспечение генерирует MEX-функцию, которая запускается в одном потоке. Отключите параллелизацию, чтобы сравнить эффективность последовательной и параллельной версий сгенерированной MEX-функции или кода C/C + +. Можно также отключить параллелизацию, чтобы решить проблемы с параллельной версией.

Входные параметры

свернуть все

Индексная переменная, начальное значение которой InitVal и конечное значение EndVal.

Начальное значение для индексной переменной цикла, Loopvar. С EndVal, задает parfor вектор области значений, который должен иметь вид M:N.

Окончательное значение для индексной переменной цикла, LoopVar. С InitVal, задает parfor вектор области значений, который должен иметь вид M:N.

Серия команд MATLAB для выполнения в parfor-цикл.

Если вы поместили более одного оператора в одну линию, разделите операторы точками с запятой. Для примера:

parfor i = 1:10
 arr(i) = rand(); arr(i) = 2*arr(i)-1;
end

Максимальное количество потоков для использования. Если вы задаете верхний предел, MATLAB Coder использует не больше, чем это число, даже если доступны дополнительные ядра. Если вы запрашиваете больше потоков, чем количество доступных ядер, MATLAB Coder использует максимальное количество ядер, доступных на момент вызова. Если итераций цикла меньше, чем потоков, некоторые потоки не выполняют никакой работы.

Если parfor- цикл не можете запускаться в нескольких потоках (для примера, если доступно только одно ядро или NumThreads 0), MATLAB Coder выполняет цикл последовательно.

Ограничения

  • Необходимо использовать компилятор, который поддерживает интерфейс приложения Open Multiprocessing (OpenMP). См. «Поддерживаемые компиляторы». Если вы используете компилятор, который не поддерживает OpenMP, MATLAB Coder лечит parfor-циклы как for-циклы. В сгенерированной MEX-функции или коде C/C + + итерации цикла выполняются в одном потоке.

  • Интерфейс приложения OpenMP несовместим с JIT MEX. См. JIT-компиляция не поддерживает OpenMP.

  • Не используйте следующие конструкции внутри parfor-циклы:

    • Вы не можете вызвать внешние функции, используя coder.extrinsic в теле a parfor-цикл.

    • Вы не можете записать в глобальную переменную внутри parfor-цикл.

    • MATLAB Coder не поддерживает использование coder.ceval в сокращениях. Для примера вы не можете сгенерировать код для следующих parfor-цикл:

      parfor i = 1:4
        y = coder.ceval('myCFcn',y,i);
      end
      Вместо этого запишите локальную функцию, которая вызывает код С используя coder.ceval и вызовите эту функцию в parfor-цикл. Для примера:
      parfor i = 1:4
        y = callMyCFcn(y,i);
      end
      function y = callMyCFcn(y,i)
       y = coder.ceval('mCyFcn', y , i);
      end

    • Вы не можете использовать varargin или varargout в parfor-циклы.

  • Тип индекса цикла должен быть представим целому типу на целевой компьютер. Используйте тип, который не требует многословного типа в сгенерированном коде.

  • parfor для автономной генерации кода требуется подход набора инструментальных средств для создания исполняемых файлов или библиотек. Не изменяйте настройки, которые заставляют генератор кода использовать подход make-файла шаблона. Смотрите проект или строение, использующую файл make-файла шаблона.

Полный список ограничений см. в разделе Ограничения parfor.

Совет

  • Используйте parfor-цикл, когда:

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

    • У вас есть итерации цикла, выполнение которых занимает много времени.

  • Не используйте parfor-loop, когда итерация в вашем цикле зависит от результатов других итераций.

    Сокращения являются одним из исключений из этого правила. reduction variable накапливает значение, которое зависит от всех итераций вместе, но не зависит от порядка итерации.

  • Входной параметр NumThreads устанавливает num_threads() OpenMP предложение в сгенерированном коде. OpenMP также поддерживает глобальное ограничение количества потоков в C/C + + путем установки переменного окружения OMP_NUM_THREADS или при помощи omp_set_num_threads(). Для получения дополнительной информации см. спецификации openMP. https://www.openmp.org/specifications/

Введенный в R2012b