Ускорьте for- Реализация цикла в Коде, Сгенерированном при помощи parfor

Когда вы генерируете код C/C++ для модели при помощи MATLAB Function, MATLAB System, и блока подсистемы For Each, по умолчанию, генератор кода производит код, который реализует for- циклы в одном потоке. Этот for- цикл может быть оптимизирован для блоков MATLAB System и MATLAB Function. Итерации parfor- цикл может запуститься параллельно на нескольких ядрах на целевом компьютере.

Выполнение итераций параллельно может значительно улучшить скорость выполнения сгенерированного кода. Для получения дополнительной информации смотрите, Как циклы parfor Улучшают Скорость Выполнения.

Генератор кода реализует for- циклы параллельно при помощи OpenMP.

Программное обеспечение Embedded Coder™ использует интерфейс приложения Open Multiprocessing (OpenMP), чтобы поддержать общую память, многожильную генерацию кода. По умолчанию Embedded Coder использует столько потоков, сколько он находит доступным. Если вы задаете количество потоков, чтобы использовать, Embedded Coder использует самое большее, что количество потоков, даже если дополнительные потоки доступны. Для получения дополнительной информации смотрите parfor.

Как циклы parfor Улучшают Скорость Выполнения

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

Каждое выполнение тела parfor- цикл называется итерацией. Потоки оценивают итерации в произвольном порядке и друг независимо от друга. Поскольку каждая итерация независима, потоки не должны синхронизироваться. Если количество потоков равно количеству итераций цикла, каждый поток выполняет одну итерацию цикла. Если количество итераций больше количества потоков, некоторые потоки выполняют больше чем одну итерацию цикла.

Например, когда цикл 100 итераций работает на 20 потоках, каждый поток одновременно выполняет пять итераций цикла. Если ваш цикл занимает много времени, чтобы запуститься из-за большого количества итераций или длинных отдельных итераций, можно значительно уменьшать время выполнения при помощи нескольких потоков. В этом примере вы не можете получить улучшение 20 раз скорости из-за издержек распараллеливания, таких как создание потока и удаление.

Когда Использовать циклы parfor

Использование parfor когда вы имеете:

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

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

Если не Использовать циклы parfor

Не использовать parfor когда:

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

    Помочь вам избегать использования parfor когда итерация вашего цикла зависит от других итераций, Embedded Coder задает твердую классификацию переменных. Для получения дополнительной информации смотрите Классификацию Переменных в циклах parfor. Если Embedded Coder обнаруживает циклы, которые не соответствуют parfor технические требования, это не генерирует код и производит ошибку.

    Сокращения являются исключением из правила, что итерации цикла должны быть независимыми. reduction variable накапливает значение, которое зависит от всех итераций вместе, но независимо от порядка итерации. Для получения дополнительной информации смотрите Переменные Сокращения.

  • Существует только несколько итераций, которые выполняют некоторые простые вычисления.

    Примечание

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

  • Поскольку Каждая Подсистема содержит блок S-Function. Сгенерированный код не будет содержать parfor.

Запишите Код при помощи циклов parfor

Чтобы запустить циклы for параллельно в сгенерированном коде, запишите код в MATLAB Function или блок MATLAB System, с помощью parfor.

  1. Создайте модель Simulink™.

  2. Добавьте MATLAB Function или блок MATLAB System к модели.

  3. Добавьте код в MATLAB Function или блок MATLAB System.

    function y = access3a(u) %#codegen
    
    %   Copyright 2010 The MathWorks, Inc.
    
    persistent pA;
    if isempty(pA)
        pA = 0;
    end
    A = ones(20,50);
    t = 0;
    
    parfor (i = 1:10,4) 
        A(i,1) = A(i,1) + 1;                    
    end
    
    y = A(1,4) + u + t + pA;

  4. В Optimization панель выбирают Maximize execution speed опция от Приоритета выпадающий список. Параметр Генерирует параллельные циклы for, автоматически выбран. Параметр позволяет компилятору вычислить циклы параллельно.

  5. Соедините блоки.

  6. Создайте модель и сгенерируйте код.

    В сгенерированном коде прагма дает компилятору команду выполнять цикличное выполнение в циклах for параллели OpenMP посредством многопоточности:

    #pragma omp parallel for num_threads(4 > 
                    omp_get_max_threads() ? omp_get_max_threads() : 4)

    Номер 4 указывает на количество обработки потоков.

Поскольку тело цикла может выполниться параллельно на нескольких потоках, оно должно соответствовать определенным ограничениям. Если программное обеспечение Embedded Coder обнаруживает циклы, которые не соответствуют parfor технические требования, это производит ошибку. Для получения дополнительной информации см. parfor Ограничения.

Похожие темы