parfor

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

Синтаксис

parfor LoopVar = InitVal:EndVal; Statements; end
parfor (LoopVar = InitVal:EndVal, NumThreads); Statements; end

Описание

пример

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

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

Сгенерируйте 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

Сгенерируйте 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.

Цикл for начального значения индексирует переменную, Loopvar. С EndVal, задает вектор области значений parfor, который должен иметь форму M:N.

Цикл for окончательного значения индексирует переменную, 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 в теле 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 - цикл, когда итерация в вашем цикле будет зависеть от результатов других итераций.

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

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

Представленный в R2012b