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 N.

Цикл for окончательного значения индексирует переменную, LoopVar. С InitVal, задает вектор области значений parfor, который должен иметь форму M:N 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 - цикл, когда итерация в вашем цикле будет зависеть от результатов других итераций.

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

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

Была ли эта тема полезной?