Если вам нужно переместить файлы сгенерированного кода в другую среду разработки, такую как система или интегрированная среда разработки (IDE), которая не включает MATLAB®, вы можете использовать packNGo
функция в командной строке или опция Package в GPU Coder™ приложения. Файлы упакованы в сжатый файл, который можно переместить и распаковать с помощью стандартной zip утилиты.
Поскольку код, сгенерированный с помощью GPU Coder, полагается на сторонние компиляторы, библиотеки для создания и запуска исполняемых файлов, среда разработки, к которой вы перемещаетесь, также должна удовлетворять этим требованиям. Для получения дополнительной информации см. раздел Установка необходимых продуктов и Настройка необходимых продуктов.
Примечание
GPU Coder требует, чтобы 'minimalHeaders'
опция packNGo
для команды задано значение false
. Этот параметр предписывает программному обеспечению включать все заголовочные файлы, найденные в пути включения в zip-файл (а не минимальные заголовочные файлы, необходимые для создания кода). Для примера, packNGo(buildInfo,'minimalHeaders',false)
.
Этот пример показов, как упаковать сгенерированный код в zip- файла для перемещения с помощью опции Package в приложении GPU Coder. Пример использует приложение Sobel ребра detection, чтобы продемонстрировать эту концепцию. По умолчанию GPU Coder создает zip- файла в текущей рабочей папке.
Необходимые условия
Графический процессор с поддержкой NVIDIA ® CUDA ®
Инструментарий и драйверы CUDA.
Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Оборудование сторонних производителей. Для настройки переменных окружения смотрите Настройка обязательных продуктов.
Функция точки входа обнаружения ребер Sobel
В алгоритме обнаружения ребер Собеля выполняется 2-D операция пространственного градиента на полутоновом изображении. Эта операция подчеркивает области высокой пространственной частоты, которые соответствуют ребрам.
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
Алгоритм ребра Собеля вычисляет горизонтальный градиент (resX
) и вертикальный градиент (resY
) входного изображения при помощи двух ортогональных ядер фильтра (maskX
и maskY
). После операции фильтрации алгоритм вычисляет величину градиента и применяет треугольник, чтобы найти области изображений, которые считаются ребрами.
Запустите алгоритм обнаружения ребер Собеля на тестовом изображении
Алгоритм фильтрации Собеля работает с полутоновыми изображениями. Преобразуйте цветное изображение в эквивалентное полутоновое с нормированными значениями (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 и его ассоциированный заголовочный файл main_sobel.h. Этот пользовательский основной файл считывает вход изображение из inputImage.csv
файл, вызывает sobelEdge
функция в сгенерированной sobelEdge.cu
файл, и сохраняет данные из краевого обнаруженного изображения в outputMag.csv
файл.
Упаковать сгенерированный код используя приложение GPU Coder
Откройте приложение GPU Coder на вкладке MATLAB Toolstrip Apps, в разделе Генерация кода щелкните значок приложения GPU Coder.
На странице Select Source Files введите имя функции точки входа sobelEdge.m
. Нажмите кнопку Далее, чтобы перейти на страницу Задать входные типы.
Задайте, что входной Image
имеет двойной тип данных и размер переменной с верхней границей 1024. Чтобы задать размер переменной с верхней границей 1024, выберите :1024
. Нажмите кнопку Далее, чтобы перейти на страницу Проверка проблем во время выполнения.
Проверьте наличие проблем во время выполнения. В диалоговом окне «Проверка проблем во время выполнения» введите код, который вызывает sobelEdge
с двойным входом. Для примера, sobelEdge(ones(648,484))
. Нажмите Проверить на проблемы. Чтобы проверить на проблемы во время выполнения, приложение генерирует и запускает MEX-функцию. Приложение не находит проблем для sobelEdge
. Нажмите кнопку Далее, чтобы перейти на страницу Сгенерировать код.
В диалоговом окне «Генерация» установите для типа сборки значение «Исполняемый». Можно также упаковать код, сгенерированный для целей Source Code, Static Library или Dynamic Library. Вы не можете упаковать код, сгенерированный для целей MEX. Щелкните Дополнительные параметры.
На вкладке Пользовательский код в разделе Пользовательский код С для сгенерированных файлов установите значение Дополнительные исходные файлы main_sobel.cu
. Нажмите кнопку Закрыть, чтобы перейти на страницу Сгенерировать код.
Щелкните Сгенерировать (Generate). Нажмите кнопку Далее, чтобы перейти на страницу Готово рабочего процесса. На странице Finish Workflow нажмите Package.
В диалоговом окне «Пакет» укажите имя файла пакета и тип упаковки. По умолчанию приложение выводит имя файла пакета из имени проекта. Приложение сохраняет файл в текущей рабочей папке. По умолчанию приложение упаковывает сгенерированные файлы как одну, плоскую папку. В данном примере используйте значения по умолчанию и нажмите кнопку Сохранить.
Этот zip-файл содержит код CUDA C++ и файлы заголовков, необходимые для перемещения. Он не содержит:
Скомпилируйте флаги
Определяет
Makefiles
Пример основных файлов, если вы не конфигурируете генерацию кода, чтобы сгенерировать и скомпилировать пример основной функции.
Осмотрите содержимое sobelEdge_pkg.zip
в рабочей папке, чтобы убедиться, что она готова к перемещению в целевую систему. В зависимости от инструмента zip, который вы используете, вы потенциально можете открыть и просмотреть файл, не распаковывая его. Теперь можно переместить полученный zip-файл в нужную среду разработки и распаковать файл.
Упакуйте сгенерированный код в командной строке
Чтобы сгенерировать исполняемый файл CUDA для sobelEdge
function, создайте объект строения кода GPU и запустите 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
объект. The BuildInfo
объект содержит информацию для компиляции и связывания сгенерированного кода, включая список всех исходных и включать файлы и их пути.
buildInfoFile = fullfile(pwd,'codegen','exe','sobelEdge','buildInfo.mat'); load(buildInfoFile);
Создайте zip- файла при помощи packNGo
функция.
packNGo(buildInfo,'packType','flat','nestedZipFiles',true,... 'minimalHeaders',false,'includeReport',false);
The packNGo
функция создает sobelEdge.zip
файл в текущей рабочей папке. Этот zip-файл содержит код CUDA C++ и файлы заголовков, необходимые для перемещения. Он не содержит:
Скомпилируйте флаги
Определяет
Makefiles
Пример основных файлов, если вы не конфигурируете генерацию кода, чтобы сгенерировать и скомпилировать пример основной функции.
Осмотрите содержимое 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', 'ierarchical',... |
Включите все заголовочные файлы, найденные в пути включения в zip-файл (а не минимальные заголовочные файлы, необходимые для создания кода). Для GPU Coder эта опция должна быть установлена на false. | packNGo(buildInfo,'minimalHeaders',false); |
Сгенерируйте предупреждения для ошибок анализа и отсутствующих файлов. | packNGo (buildInfo, 'ignoreParseError', true,... |
Для получения дополнительной информации см. packNGo
.
Прежде чем вы сгенерируете и упакуете файлы, решите, хотите ли вы упаковать файлы в плоскую или иерархическую структуру папки. По умолчанию, packNGo
функция упаковывает файлы в одну, плоскую структуру папки. Этот подход является самым простым и может быть оптимальным выбором.
Если | Использовать |
---|---|
Вы перемещаете файлы в IDE, которая не использует сгенерированный make-файл, или код не зависит от относительного расположения необходимых статических файлов | Единая, плоская структура папки |
Целевая среда разработки должна поддерживать структуру папок исходного окружения, потому что она использует сгенерированный make-файл, или код зависит от относительного расположения файлов | Иерархическая структура |
Если используется иерархическая структура, packNGo
функция создает два уровня zip- файлов. Существует основной zip- файла, который, в свою очередь, содержит следующие вторичные zip- файлов:
mlrFiles.zip
- файлы в вашем
дерево папокmatlabroot
sDirFiles.zip
- файлы в папке сборки и в ней, где вы инициировали генерацию кода
otherFiles.zip
- необходимые файлы не в
или matlabroot
start
деревья папок
Пути для вторичных zip- файлов относятся к корневой папке основного zip- файла, поддерживая структуру исходной папки разработки.