GPU Coder™ генерирует оптимизированный CUDA® код от Simulink® модели, содержащие блоки MATLAB Function. Можно использовать сгенерированный код и исполняемый файл для быстрого прототипирования на NVIDIA® Графические процессоры. Отчеты генерации кода и трассируемость позволяют вам просмотреть и анализировать сгенерированный код. Основные шаги для генерации кода CUDA при помощи GPU Coder:
Создайте или откройте модель.
Сконфигурируйте модель для генерации кода путем выбора решателя, языка, набора инструментальных средств и других специфичных для графического процессора параметров конфигурации.
Создайте модель.
Алгоритм обнаружения ребра Sobel является простым алгоритмом обнаружения ребра, который выполняет 2D пространственную операцию градиента на полутоновом изображении. Этот алгоритм подчеркивает высокие пространственные области частоты, которые соответствуют ребрам входного изображения.
Алгоритм ребра Sobel вычисляет горизонтальный градиент (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);
Создайте модель Simulink и вставьте два блока MATLAB Function из библиотеки User-Defined Functions.
Добавьте блок Constant и установите его значение к 0.4
.
Добавьте блок From Multimedia File из библиотеки Computer Vision Toolbox™.
Откройте диалоговое окно Block Parameters для блока From Multimedia File и установите параметр File name на rhinos.avi
.
Установите параметр Image signal на One multidimensional signal
.
Добавьте два блока Video Viewer от библиотеки Computer Vision Toolbox до модели.
Дважды кликните на одном из блоков MATLAB Function. Функциональная подпись по умолчанию появляется в Редакторе Блока MATLAB Function.
Задайте функцию под названием 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
Откройте параметры блоков для блока MATLAB Function. На вкладке Code Generation выберите Reusable function
для параметра Function packaging.
Если параметр Function packaging устанавливается на значение, ядра CUDA не могут быть сгенерированы.
Измените другой блок MATLAB Function, чтобы реализовать RGB к полутоновому преобразованию до операции обнаружения ребра Sobel. Установите параметр 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
Соедините эти блоки как показано в схеме. Сохраните модель как edgeDetection.slx
.
Чтобы протестировать модель на ошибки, симулируйте модель в Редакторе Simulink. На панели инструментов нажмите Run.
Чтобы видеть все видеокадры в процессе моделирования, отключите опцию Simulation > Drop Frames to improve Performance блока Video Viewer.
Параметры конфигурации модели предоставляют много возможностей для генерации кода и процесса сборки.
Откройте диалоговое окно Configuration Parameters. Откройте панель Solver. Чтобы скомпилировать вашу модель для ускорения и сгенерировать код CUDA, сконфигурируйте модель, чтобы использовать решатель фиксированного шага. Эта таблица показывает настройку решателя для этого примера.
Параметр | Установка | Эффект на сгенерированном коде |
---|---|---|
Type | Fixed-step | Обеспечивает постоянный (фиксированный) размер шага, который требуется для генерации кода |
Solver | discrete (no continuous states) | Применяет метод интегрирования фиксированного шага для вычисления производной состояния модели |
Fixed-step size | auto | Simulink выбирает размер шага |
На панели Code Generation, набор System target file к grt.tlc
.
Можно также использовать Embedded Coder® конечный файл ert.tlc
.
Установите Language на C++
.
Выберите Generate GPU code.
На панели Code Generation выберите Generate code only.
Выберите Toolchain. Для Linux® платформы, выберите NVIDIA CUDA | gmake (64-bit Linux)
. Для Windows® системы, выберите NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)
.
На панели Code Generation > Interface отключите MAT-file logging.
На панели Code Generation > Report выберите Create code generation report и Open report automatically.
Когда вы включаете параметр Generate GPU code, опции, характерные для GPU Coder, появляются в панели Code Generation > GPU Code.
В данном примере можно использовать значения по умолчанию специфичных для графического процессора параметров в панели Code Generation > GPU Code.
Нажмите OK, чтобы сохранить и закрыть диалоговое окно Configuration Parameters.
Можно использовать set_param
функция, чтобы сконфигурировать программно параметр модели в MATLAB® Командное окно.
set_param('edgeDetection','GenerateGPUCode','CUDA');
В Редакторе Simulink откройте приложение Simulink Coder.
Сгенерируйте код.
Сообщения появляются в Средстве просмотра Диагностики. Генератор кода производит исходные и заголовочные файлы CUDA и отчет генерации кода HTML. Генератор кода помещает файлы в папку сборки, подпапку под названием edgeDetection_grt_rtw
под вашей текущей рабочей папкой.
Можно найти ядра CUDA в <model_name>_eML_blk_kernel
и <model_name>_eML_blk_kernel_c
функции. Информацией в тройных двойных угловых скобках является настройка выполнения для ядра.
Генерация кода графического процессора для MATLAB Function блокируется в Stateflow® графики не поддерживаются.
Блок MATLAB Function не поддерживает все типы данных с языка MATLAB. Для поддерживаемых типов данных обратитесь к документации блока.
open_system
(Simulink) | load_system
(Simulink) | save_system
(Simulink) | close_system
(Simulink) | bdclose
(Simulink) | get_param
(Simulink) | set_param
(Simulink) | sim
(Simulink) | slbuild
(Simulink)