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

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

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

  • Сконфигурируйте модель для генерации кода, выбрав решатель, язык, набор инструментов и другие специфичные для 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. На панели Code Generation установите значение System target file grt.tlc.

    Можно также использовать Embedded Coder® конечный файл ert.tlc.

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

  4. Выберите Generate GPU code.

  5. На панели Code Generation выберите 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. Когда вы включаете параметр Generate GPU code, опции, характерные для GPU Coder, появляются на панели Code Generation > GPU Code.

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

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

  10. Нажмите кнопку OK, чтобы сохранить и закрыть диалоговое окно Параметров конфигурации.

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

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

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

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

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

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

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

Ограничения

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

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

См. также

Функции

Похожие темы