exponenta event banner

parfor

Параллель for- петля

Описание

пример

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

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

пример

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

Примеры

свернуть все

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

Напишите функцию 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 использует не более этого числа, даже если доступны дополнительные ядра. При запросе большего количества потоков, чем количество доступных ядер, кодер MATLAB использует максимальное количество ядер, доступное на момент вызова. Если итераций цикла меньше, чем потоков, некоторые потоки не выполняют никаких действий.

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

Ограничения

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

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

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

    • Нельзя вызывать внешние функции с помощью coder.extrinsic в теле parfor-луп.

    • Запись в глобальную переменную внутри parfor-луп.

    • Кодер MATLAB не поддерживает использование coder.ceval в сокращениях. Например, нельзя создать код для следующего parfor-loop:

      parfor i = 1:4
        y = coder.ceval('myCFcn',y,i);
      end
      Вместо этого следует записать локальную функцию, которая вызывает код C с помощью 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 для создания автономного кода требуется подход, основанный на цепочке инструментов, для создания исполняемых файлов или библиотек. Не изменяйте параметры, которые заставляют генератор кода использовать подход makefile шаблона. См. раздел Проект или конфигурация с использованием Makefile шаблона.

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

Совет

  • Использовать parfor-закольцовывание при:

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

    • Существует цикл итераций, выполнение которых занимает много времени.

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

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

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

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