parfor

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

Описание

пример

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, в a 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-функции для a 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-функцию для a parfor- цикл.

Запишите функцию MATLAB, test_parfor, это вызывает функцию быстрого преобразования Фурье, fft, в a 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.

Индексная переменная цикла 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 в теле a parfor- цикл.

    • Вы не можете записать в глобальную переменную внутри a 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 \in parfor- циклы.

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

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

Для всестороннего списка ограничений см. parfor Ограничения.

Советы

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

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

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

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

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

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

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