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