Ускорение симуляции при помощи GPU Coder

Можно использовать GPU Coder™, чтобы ускорить выполнение Simulink® модель на NVIDIA® Графические процессоры. Ускоренные графическим процессором вычисления следуют гетерогенной модели программирования. Сильно параллелизируемые фрагменты приложения отображаются в ядра, которые выполняются на тысячах ядер графический процессор параллельно, в то время как остальная часть последовательного кода все еще работает на центральном процессоре.

Чтобы выполнить симуляцию с ускорением графического процессора, смоделируйте вычислительные интенсивные фрагменты вашего приложения в Simulink с помощью блоков MATLAB Function (Simulink). Когда вы симулируете модель, которая содержит блок MATLAB Function, программное обеспечение разделяется и генерирует CUDA® MATLAB® исполняемый код (MEX) и интегрирует этот код с моделью Simulink.

Основные шаги для ускорения симуляции при помощи GPU Coder:

  • Создайте или откройте модель.

  • Сконфигурируйте модель для ускорения графический процессор, выбрав Solver, Language и другие параметры конфигурации GPU.

  • Запустите модель ускорения графического процессора.

Пример: Sobel Edge Detection

Алгоритм обнаружения ребер Собеля является простым алгоритмом обнаружения ребер, который выполняет 2-D пространственную операцию градиента на полутоновом изображении. Этот алгоритм подчеркивает области высокой пространственной частоты, которые соответствуют ребрам входа изображения.

Алгоритм ребра Собеля вычисляет горизонтальный градиент (H) и вертикальный градиент (V) входного изображения при помощи двух ортогональных ядер фильтра (k и k'). После операции фильтрации алгоритм вычисляет величину градиента и применяет порог для поиска областей изображений, которые считаются ребрами.

k = single([1 2 1; 0 0 0; -1 -2 -1]);
H = conv2(single(grayImage),k, 'same');
V = conv2(single(grayImage),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);

MATLAB peppers.png test image and its edge detected output.

Создайте модель обнаружения ребер

  1. Создайте модель Simulink и вставьте два блока MATLAB Function из библиотеки User-Defined Functions.

  2. Добавьте блок Constant и установите его значение 0.4.

  3. Добавьте блок From Multimedia File из библиотеки Computer Vision Toolbox™.

  4. Откройте диалоговое окно Block Parameters для блока From Multimedia File и установите параметр File name равным rhinos.avi.

    Установите параметр Image signal равным One multidimensional signal.

  5. Добавьте в модель два блока Video Viewer из библиотеки Computer Vision Toolbox.

    Simulink model containing blocks for implementing edge detection algorithm.

  6. Дважды кликните один из блоков MATLAB Function. Сигнатура функции по умолчанию появится в редакторе блоков MATLAB Function.

  7. Задайте функцию, называемую sobel, который реализует алгоритм обнаружения ребер Собеля. Заголовок функции объявляет grayImage и threshold как аргумент к sobel функция, с edgeImage как возврат значение. Сохраните документ Editor в файл.

    function edgeImage  = sobel(grayImage,threshold)   %#codegen
    
    % Define Kernel for Sobel edge detection
    k = single([1 2 1; 0 0 0; -1 -2 -1]);
    
    % Detect Edge
    H = conv2(single(grayImage),k, 'same');
    V = conv2(single(grayImage),k','same');
    E = sqrt(H.*H + V.*V);
    edgeImage = uint8((E > threshold) * 255);
    
    end
    

  8. Откройте параметры блоков MATLAB Function. На вкладке Code Generation выберите Reusable function для Function packaging параметра.

    Если для параметра Function packaging задано любое другое значение, ядра CUDA могут не сгенерироваться.

  9. Измените другой MATLAB Function блок, чтобы реализовать преобразование RGB в полутоновый перед операцией обнаружения ребра Собеля. Установите параметр Function packaging блока MATLAB Function равным Reusable function.

    function gray = RGB2gray(RGB)   %#codegen
    % Convert color image to grey image
    
    gray = (0.2989 * double(RGB(:,:,1)) + ...
        0.5870 * double(RGB(:,:,2)) + ...
        0.1140 * double(RGB(:,:,3)));
    
    end
  10. Соедините эти блоки как показано на схеме. Сохраните модель как edgeDetection.slx.

    Simulink model showing connection between the blocks.

  11. Чтобы протестировать модель на ошибки, симулируйте модель в Редактор. На панели инструментов нажмите кнопку Run.

    Чтобы увидеть все видеокадры во время симуляции, отключите опцию Simulation > Drop Frames to improve Performance блока Video Viewer.

    Edge detected output from the Video Viewer block.

Сконфигурируйте модель для ускорения графического процессора

Параметры конфигурации модели определяют метод ускорения, используемый во время симуляции.

  1. Откройте диалоговое окно Параметры конфигурации. Откройте панель Solver. Чтобы скомпилировать модель для ускорения и сгенерировать код CUDA, сконфигурируйте модель, чтобы использовать решатель с фиксированным шагом. В этой таблице показано строение решателя для этого примера.

    ПараметрНастройкаЭффект на сгенерированный код
    TypeFixed-stepПоддерживает постоянный (фиксированный) размер шага.
    Solverdiscrete (no continuous states)Применяет метод интегрирования с фиксированным шагом для вычисления производной состояния модели.
    Fixed-step sizeautoSimulink выбирает размер шага.

    Snapshot of the configuration parameters dialog showing solver options for simulation.

  2. На панели Simulation Target включите GPU acceleration параметр.

    Примечание

    Параметр Language автоматически устанавливается на C++.

  3. Теперь на панели Simulation Target > GPU Acceleration видны специальные опции GPU Coder. В целях этого примера можно использовать значения по умолчанию для всех специфичных для GPU параметров.

    GPU Acceleration pane on the configuration parameters dialog of the model.

  4. Чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters), нажмите кнопку OK.

    Вы также можете использовать set_param (Simulink) функция для программной настройки параметров модели в Окне команды MATLAB.

    set_param('edgeDetection','GPUAcceleration','on');
    

Построение модели ускоренного графического процессора

Чтобы создать и симулировать модель ускорения графического процессора, выберите Run на вкладке Simulation или используйте следующую команду MATLAB:

sim('edgeDetection');

Сначала программное обеспечение проверяет, был ли код CUDA ранее скомпилирован для модели. Если код был создан ранее, программное обеспечение запускает модель. Если код ранее не был построен, программное обеспечение сначала генерирует и компилирует код CUDA, а затем запускает модель. Инструмент генерации кода помещает сгенерированный код в подпапку рабочей папки под названием slprj/_slprj/edgeDetection.

Edge detected output from the Video Viewer block.

Ограничения

  • Генерация кода GPU для блоков MATLAB Function в Stateflow® графики не поддерживаются.

  • Когда GPU acceleration включено, генератор кода не поддерживает Import custom code для импорта пользовательских исходных файлов CUDA (* .cu). Вместо этого используйтеcoder.ceval внутри блока MATLAB Function.

  • Блок MATLAB Function не поддерживает все типы данных из языка MATLAB. Поддерживаемые типы данных см. в документации по блокам.

См. также

Функции

Похожие темы