Можно использовать GPU Coder™, чтобы ускорить выполнение Simulink® модель на NVIDIA® Графические процессоры. Ускоренные графическим процессором вычисления следуют гетерогенной модели программирования. Сильно параллелизируемые фрагменты приложения отображаются в ядра, которые выполняются на тысячах ядер графический процессор параллельно, в то время как остальная часть последовательного кода все еще работает на центральном процессоре.
Чтобы выполнить симуляцию с ускорением графического процессора, смоделируйте вычислительные интенсивные фрагменты вашего приложения в Simulink с помощью блоков MATLAB Function (Simulink). Когда вы симулируете модель, которая содержит блок MATLAB Function, программное обеспечение разделяется и генерирует CUDA® MATLAB® исполняемый код (MEX) и интегрирует этот код с моделью Simulink.
Основные шаги для ускорения симуляции при помощи GPU Coder:
Создайте или откройте модель.
Сконфигурируйте модель для ускорения графический процессор, выбрав Solver, Language и другие параметры конфигурации 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 выбирает размер шага. |
На панели Simulation Target включите GPU acceleration параметр.
Примечание
Параметр Language автоматически устанавливается на C++
.
Теперь на панели Simulation Target > GPU Acceleration видны специальные опции GPU Coder. В целях этого примера можно использовать значения по умолчанию для всех специфичных для GPU параметров.
Чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters), нажмите кнопку OK.
Вы также можете использовать set_param
(Simulink) функция для программной настройки параметров модели в Окне команды MATLAB.
set_param('edgeDetection','GPUAcceleration','on');
Чтобы создать и симулировать модель ускорения графического процессора, выберите Run на вкладке Simulation или используйте следующую команду MATLAB:
sim('edgeDetection');
Сначала программное обеспечение проверяет, был ли код CUDA ранее скомпилирован для модели. Если код был создан ранее, программное обеспечение запускает модель. Если код ранее не был построен, программное обеспечение сначала генерирует и компилирует код CUDA, а затем запускает модель. Инструмент генерации кода помещает сгенерированный код в подпапку рабочей папки под названием slprj/_slprj/edgeDetection
.
Генерация кода GPU для блоков MATLAB Function в Stateflow® графики не поддерживаются.
Когда GPU acceleration включено, генератор кода не поддерживает Import custom code для импорта пользовательских исходных файлов CUDA (* .cu). Вместо этого используйтеcoder.ceval
внутри блока MATLAB Function.
Блок 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)