Генерация кода из моделей Simulink при помощи GPU Coder

GPU Coder™ производит Код С++ CUDA® из моделей Simulink®, содержащих блоки MATLAB Function. Сгенерированный код и исполняемый файл могут использоваться для быстрого прототипирования на графических процессорах, таких как NVIDIA® Tesla® и NVIDIA Tegra®. Отчеты генерации кода и трассируемость позволяют вам просматривать и анализировать сгенерированный код. Основные шаги для Генерации кода CUDA при помощи GPU Coder:

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

  • Сконфигурируйте модель для генерации кода путем выбора решателя, языка, набора инструментальных средств и других специфичных для графического процессора параметров конфигурации

  • Создайте модель

Пример: обнаружение ребра Sobel

Алгоритм обнаружения ребра Sobel выполняет 2D пространственную операцию градиента на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, который соответствует ребрам входного изображения. Алгоритм вычисляет горизонтальный градиент (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 (Simulink) и установите его значение к 0.4. Добавьте блок From Multimedia File (Computer Vision Toolbox) из библиотеки Computer Vision Toolbox™.

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

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

  4. Добавьте два Video Viewer (Computer Vision Toolbox) блоки от библиотеки Computer Vision Toolbox до модели.

    Simulink model containing blocks for implementing edge detection algorithm.

  5. Дважды кликните на одном из блоков MATLAB Function. Функциональная подпись по умолчанию появляется в Редакторе Блока MATLAB Function.

  6. Задайте функцию под названием sobel, который реализует алгоритм обнаружения ребра Sobel. Функциональный заголовок объявляет grayImage и threshold в качестве аргумента к sobel функция, с edgeImage как возвращаемое значение. Сохраните документ Редактора к файлу.

    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
    

  7. Щелкните правой кнопкой по блоку MATLAB Function и выберите Block Parameters (Subsystem).

  8. На вкладке Code Generation выберите Reusable function для Function packaging.

  9. Повторите шаги 3 и 4 для другого блока MATLAB Function. Этот блок реализует RGB к полутоновому преобразованию до операции обнаружения ребра Sobel.

    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. Чтобы протестировать на ошибки, симулируйте модель в Редакторе Simulink с помощью кнопки Run на панели инструментов. Чтобы видеть все видеокадры в процессе моделирования, отключите опцию Simulation > Drop Frames to improve Performance блока Video Viewer.

    Edge detected output from the Video Viewer block.

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

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

  1. Откройте диалоговое окно Configuration Parameters, панель Solver. Чтобы сгенерировать код CUDA для модели, необходимо сконфигурировать модель, чтобы использовать решатель фиксированного шага. Эта опция обеспечивает постоянный (фиксированный) размер шага, который требуется для генерации кода.

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

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

  2. Выберите панель Code Generation. Установите System target file на grt.tlc. Можно также использовать конечный файл Embedded Coder® ert.tlc.

  3. Установите Language на C++.

  4. Выберите Generate GPU code. GPU Coder определенные опции теперь отображается в панели Code Generation > GPU Code.

  5. Выберите Generate code only.

  6. Выберите Toolchain. Для Linux® платформы выбирают NVIDIA CUDA | gmake (64-bit Linux). Для систем Windows® выберите NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows).

  7. На панели Code Generation > Interface отключите MAT-file logging. Генератор кода не поддерживает логгирование MAT-файла при генерации кода CUDA.

  8. На панели Code Generation > Report выберите Create code generation report и Open report automatically.

  9. В целях этого примера можно использовать значения по умолчанию специфичных для графического процессора параметров в панели Code Generation > GPU Code.

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

  10. Нажмите OK, чтобы сохранить и закрыть диалоговое окно Configuration Parameters.

  11. В качестве альтернативы можно использовать set_param (Simulink), чтобы сконфигурировать программно параметр модели из командного окна MATLAB®. Например,

    set_param('edgeDetection','GenerateGPUCode','CUDA');
    

Сгенерируйте код CUDA для модели

  1. В Редакторе Simulink откройте приложение Simulink Coder.

  2. Сгенерируйте код.

    Сообщения появляются в Средстве просмотра Диагностики. Генератор кода производит исходные и заголовочные файлы CUDA и отчет генерации кода HTML. Генератор кода помещает файлы в папку сборки, подпапку под названием edgeDetection_grt_rtw под вашей текущей рабочей папкой.

    Можно найти ядра CUDA в <model_name>_eML_blk_kernel и <model_name>_eML_blk_kernel_c функции. Информацией в тройных двойных угловых скобках является настройка выполнения для ядра.

  3. Пример сгенерированного кода CUDA.

     edgeDetection.cu

Ограничения

  • Использование блоков MATLAB Function в графиках Stateflow® не поддерживается.

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

  • Для генерации кода графического процессора параметра Terminate function required в Code Generation> должна быть включена панель Interface.

Смотрите также

Функции

Похожие темы