Если необходимо переместить файлы сгенерированного кода к другой среде разработки, такие как система или интегрированная среда разработки (IDE), которая не включает MATLAB®, можно использовать packNGo
функция в командной строке или опции Package в приложении GPU Coder™. Файлы упакованы в сжатом файле, что можно переместить и распаковать использование стандартной утилиты zip.
Поскольку код, сгенерированный при помощи GPU Coder, использует сторонние компиляторы, библиотеки, чтобы создать и запустить исполняемые файлы, среда разработки, к которой вы перемещаете, должна также удовлетворить этим требованиям. Для получения дополнительной информации смотрите Устанавливающие Необходимые как условие продукты и Подготовку Необходимых как условие продуктов.
Примечание
GPU Coder требует что 'minimalHeaders'
опция packNGo
команда установлена в false
. Эта установка дает программному обеспечению команду включать все заголовочные файлы, найденные на включать пути в zip-файле (а не минимальные заголовочные файлы, требуемые создавать код). Например, packNGo(buildInfo,'minimalHeaders',false)
.
В этом примере показано, как группировать сгенерированный код в zip-файл для перемещения с помощью опции Пакета в приложении GPU Coder. Пример использует приложение обнаружения ребра Sobel, чтобы продемонстрировать эту концепцию. По умолчанию GPU Coder создает zip-файл в текущей рабочей папке.
Необходимые условия
Оборудование NVIDIA® CUDA®, компиляторы и библиотеки. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Стороннее Оборудование. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Функция точки входа обнаружения ребра Sobel
В алгоритме обнаружения ребра Sobel выполняется 2D пространственная операция градиента на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, который соответствует ребрам.
type sobelEdge.m
function [ magnitude ] = sobelEdge( Image ) %#codegen % Copyright 2017-2019 The MathWorks, Inc. maskX = single([-1 0 1 ; -2 0 2; -1 0 1]); maskY = single([-1 -2 -1 ; 0 0 0 ; 1 2 1]); coder.gpu.kernelfun(); resX = conv2(Image, maskX, 'same'); resY = conv2(Image, maskY, 'same'); magnitude = sqrt(resX.^2 + resY.^2); thresh = magnitude < 0.4; magnitude(thresh) = 0; end
Алгоритм ребра Sobel вычисляет горизонтальный градиент (resX
) и вертикальный градиент (resY
) из входа отображают при помощи двух ортогональных ядер фильтра (maskX
и maskY
). После операции фильтрации алгоритм вычисляет величину градиента и применяет threhold, чтобы найти области изображений, которые считаются ребрами.
Запустите алгоритм обнаружения ребра Sobel для тестового изображения
Алгоритм фильтрации Sobel работает с полутоновыми изображениями. Преобразуйте цветное изображение в эквивалентное полутоновое изображение с нормированными значениями (0.0 для черного цвета, 1.0 для белого).
im = imread('hello.jpg'); imGray = (0.2989 * double(im(:,:,1)) + 0.5870 * double(im(:,:,2)) + 0.1140 * double(im(:,:,3)))/255; imSize = size(imGray); figure(); image(im); title('Test Image');
Запишите матричный серый в imputImage.csv
файл с помощью writematrix
команда. Приложение обнаружения ребра Sobel читает в этом файле CSV.
writematrix(reshape(imGray,1,[]),'inputImage.csv');
imOut = sobelEdge(double(imGray));
Отобразить ребро обнаружило изображение, переформатируйте матричный imOut
с функциональным repmat
так, чтобы можно было передать его image
команда.
figure();
image(repmat(imOut,[1 1 3]));
title('Edge Detected Image in MATLAB');
Создайте пользовательскую основную функцию для sobelEdge.m
Этот пример использует пользовательский основной файл, main_sobel.cu и его associdated заголовочный файл main_sobel.h. Этот пользовательский основной файл читает входное изображение из inputImage.csv
файл, вызывает sobelEdge
функция в сгенерированном sobelEdge.cu
файл, и сохраняет данные от обнаруженного изображения ребра в outputMag.csv
файл.
Сгенерированный код пакета Используя приложение GPU Coder
Откройте приложение GPU Coder. На вкладке MATLAB Toolstrip Apps, под Генерацией кода, кликают по значку приложения GPU Coder.
На странице Select Source Files введите имя функции точки входа sobelEdge.m
. Нажмите Далее, чтобы перейти к странице Define Input Types.
Укажите что вход Image
имеет двойной тип данных и переменный размер с верхней границей 1 024. Чтобы задать переменный размер с верхней границей 1 024, выберите :1024
. Нажмите Далее, чтобы перейти к странице Check for Run-Time Issues.
Проверяйте на проблемы во время выполнения. В диалоговом окне Check for Run-Time Issues введите код, который вызывает sobelEdge
с двойным входом. Например, sobelEdge(ones(648,484))
. Нажмите Check for Issues. Чтобы проверять на проблемы во время выполнения, приложение генерирует и запускает MEX-функцию. Приложение не находит проблемы для sobelEdge
. Нажмите Далее, чтобы перейти к Сгенерировать Кодовой странице.
В диалоговом окне Generate, набор Тип Сборки к Исполняемому файлу. Можно также группировать код, сгенерированный для Исходного кода, Статической Библиотеки или Динамических целей Библиотеки. Вы не можете группировать код, сгенерированный для целей MEX. Нажмите More Settings.
На вкладке Custom Code, под Пользовательским кодом С для Сгенерированных Файлов, устанавливает Дополнительные исходные файлы на main_sobel.cu
. Нажмите Close to переходят к Сгенерировать Кодовой странице.
Нажмите Generate. Нажмите Далее, чтобы перейти к странице Finish Workflow. На странице Finish Workflow нажмите Package.
В диалоговом окне Package задайте имя файла пакета и группирующий тип. По умолчанию приложение выводит имя файла пакета от названия проекта. Приложение сохранило файл в текущей рабочей папке. По умолчанию приложение группирует сгенерированные файлы как одну, плоскую папку. В данном примере используйте значения по умолчанию, и затем нажмите Save.
Этот zip-файл содержит Код С++ CUDA и заголовочные файлы, требуемые для перемещения. Это не содержит:
Скомпилируйте флаги
Задает
Make-файлы
Основные файлы примера, если вы не конфигурируете генерацию кода, чтобы сгенерировать и скомпилировать пример основная функция.
Смотрите содержимое sobelEdge_pkg.zip
в вашей рабочей папке, чтобы проверить, что это готово к перемещению к целевой системе. В зависимости от инструмента zip, который вы используете, можно потенциально открыть и смотреть файл, не распаковывая его. Можно теперь переместить получившийся zip-файл к желаемой среде разработки и распаковать файл.
Сгенерированный код пакета в командной строке
Сгенерировать исполняемый файл CUDA для sobelEdge
функционируйте, создайте объект настройки графического процессора кода и запустите codegen
команда.
cfg = coder.gpuConfig('exe'); cfg.GenerateReport = true; cfg.CustomSource = 'main_sobel.cu'; codegen -config cfg sobelEdge -args {coder.typeof(0,[1024 1024],[1 1])}
Code generation successful: View report
Чтобы группировать сгенерированный код в zip-файл, загрузите BuildInfo
объект. BuildInfo
объект содержит информацию для компиляции и соединения сгенерированного кода, включая список всего источника, и включайте файлы и их пути.
buildInfoFile = fullfile(pwd,'codegen','exe','sobelEdge','buildInfo.mat'); load(buildInfoFile);
Создайте zip-файл при помощи packNGo
функция.
packNGo(buildInfo,'packType','flat','nestedZipFiles',true,... 'minimalHeaders',false,'includeReport',false);
packNGo
функция создает sobelEdge.zip
файл в текущей рабочей папке. Этот zip-файл содержит Код С++ CUDA и заголовочные файлы, требуемые для перемещения. Это не содержит:
Скомпилируйте флаги
Задает
Make-файлы
Основные файлы примера, если вы не конфигурируете генерацию кода, чтобы сгенерировать и скомпилировать пример основная функция.
Смотрите содержимое sobelEdge.zip
в вашей рабочей папке, чтобы проверить, что это готово к перемещению к целевой системе. В зависимости от инструмента zip, который вы используете, можно потенциально открыть и смотреть файл, не распаковывая его. Можно теперь переместить получившийся zip-файл к желаемой среде разработки и распаковать файл.
Автономное выполнение кода
Когда вы выполняете сгенерированный независимый исполняемый файл, выход magnitudeData
вычислен и записан в разделенный от запятой файл. Считайте этот выход назад в MATLAB и используйте image
функция, чтобы визуализировать ребро обнаружила изображение.
if ispc system('sobelEdge.exe'); else system('./sobelEdge'); end imOutGPU = reshape(readmatrix('outputMag.csv'),imSize); edgeImg = repmat(imOutGPU,[1 1 3]); figure(); image(edgeImg); title('Edge Detected Image on the GPU');
Можно задать опции для packNGo
функция.
К | Задать |
---|---|
Измените структуру упаковки файла к иерархическому. | packNGo(buildInfo,'packType','hierarchical'); |
Измените структуру упаковки файла к иерархическому и переименуйте первичный zip-файл. | packNGo (buildInfo, 'packType', 'иерархический'... |
Включайте все заголовочные файлы, найденные на включать пути в zip-файле (а не минимальные заголовочные файлы, требуемые создавать код). Для GPU Coder эта опция должна быть установлена в ложь. | packNGo(buildInfo,'minimalHeaders',false); |
Сгенерируйте предупреждения для ошибок анализа и недостающих файлов. | packNGo (buildInfo, 'ignoreParseError', верный... |
Для получения дополнительной информации смотрите packNGo
.
Прежде чем вы сгенерируете и группируете файлы, решите, хотите ли вы группировать файлы в плоской или иерархической структуре папок. По умолчанию, packNGo
функциональные пакеты файлы в одной, плоской структуре папок. Этот подход является самым простым и может быть оптимальным выбором.
Если | Использование |
---|---|
Вы перемещаете файлы к IDE, который не использует сгенерированный make-файл, или код не зависит от относительного местоположения необходимых статических файлов | Одна, плоская структура папок |
Целевая среда разработки должна обеспечить структуру папок исходной среды, потому что это использует сгенерированный make-файл, или код зависит относительное местоположение файлов | Иерархическая структура |
Если вы используете иерархическую структуру, packNGo
функция создает два уровня zip-файлов. Существует первичный zip-файл, который в свою очередь содержит следующие вторичные zip-файлы:
mlrFiles.zip
— файлы в вашем
дерево папкиmatlabroot
sDirFiles.zip
— файлы в и под вашей папкой сборки, где вы инициировали генерацию кода
otherFiles.zip
— необходимые файлы не в
или matlabroot
start
деревья папки
Пути для вторичных zip-файлов относительно корневой папки первичного zip-файла, обеспечивая исходную структуру папок разработки.