GPU Coder™ генерирует оптимизированный CUDA® код из Simulink® модели, содержащие блоки MATLAB Function. Вы можете использовать сгенерированный код и исполняемый файл для быстрого прототипирования на NVIDIA® Графические процессоры. Отчеты генерации кода и трассируемость позволяют вам просматривать и анализировать сгенерированный код. Основные шаги для генерации кода CUDA при помощи GPU Coder:
Создайте или откройте модель.
Сконфигурируйте модель для генерации кода, выбрав решатель, язык, набор инструментов и другие специфичные для GPU параметры конфигурации.
Создайте модель.
Алгоритм обнаружения ребер Собеля является простым алгоритмом обнаружения ребер, который выполняет 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);
Создайте модель 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
, который реализует алгоритм обнаружения ребер Собеля. Заголовок функции объявляет 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
Откройте параметры блоков MATLAB Function. На вкладке Code Generation выберите Reusable function
для Function packaging параметра.
Если для параметра Function packaging задано любое другое значение, ядра CUDA могут не сгенерироваться.
Измените другой 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
Соедините эти блоки как показано на схеме. Сохраните модель как edgeDetection.slx
.
Чтобы протестировать модель на ошибки, симулируйте модель в Редактор. На панели инструментов нажмите кнопку Run.
Чтобы увидеть все видеокадры во время симуляции, отключите опцию Simulation > Drop Frames to improve Performance блока Video Viewer.
Параметры конфигурации модели обеспечивают много опций для генерации кода и процесса сборки.
Откройте диалоговое окно Параметры конфигурации. Откройте панель 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.
Генератор кода не поддерживает логгирование MAT-файлов при генерации кода CUDA.
На панели Code Generation > Report выберите Create code generation report и Open report automatically.
Когда вы включаете параметр Generate GPU code, опции, характерные для GPU Coder, появляются на панели Code Generation > GPU Code.
В данном примере можно использовать значения по умолчанию параметров конкретного графического процессора на Code Generation > GPU Code панели.
Нажмите кнопку OK, чтобы сохранить и закрыть диалоговое окно Параметров конфигурации.
Вы можете использовать set_param
функция для программной настройки параметра модели в MATLAB® Командное окно.
set_param('edgeDetection','GenerateGPUCode','CUDA');
В Редактор откройте приложение Simulink Coder.
Сгенерируйте код.
Сообщения отображаются в средстве просмотра. Генератор кода создает исходные и заголовочные файлы CUDA, а также отчет о HTML генерации кода. Генератор кода помещает файлы в папку сборки, подпапку с именем edgeDetection_grt_rtw
в текущей рабочей папке.
Вы можете найти ядра CUDA в <model_name>_eML_blk_kernel
и <model_name>_eML_blk_kernel_c
функций. Информация в тройных шевронах является строением выполнения для ядра.
Генерация кода GPU для блоков MATLAB Function в Stateflow® графики не поддерживаются.
Блок MATLAB Function не поддерживает все типы данных из языка MATLAB. Поддерживаемые типы данных см. в документации по блокам.
bdclose
(Simulink) | close_system
(Simulink) | get_param
(Simulink) | load_system
(Simulink) | open_system
(Simulink) | save_system
(Simulink) | set_param
(Simulink) | sim
(Simulink) | slbuild
(Simulink)