exponenta event banner

Перемещение созданного кода в другую среду разработки

При необходимости перемещения созданных кодовых файлов в другую среду разработки, например, в систему или интегрированную среду разработки (IDE), которая не включает MATLAB ®, можно использовать packNGo функция в командной строке или опция Пакет в GPU Coder™ app. Файлы упакованы в сжатый файл, который можно переместить и распаковать с помощью стандартной утилиты zip.

Поскольку код, созданный с помощью GPU Coder, основан на компиляторах сторонних производителей, библиотеках для построения и запуска исполняемых файлов, среда разработки, в которую вы перемещаетесь, также должна удовлетворять этим требованиям. Дополнительные сведения см. в разделах Установка необходимых продуктов и Настройка необходимых продуктов.

Примечание

Кодер графического процессора требует, чтобы 'minimalHeaders' вариант packNGo для команды установлено значение false. Этот параметр предписывает программному обеспечению включать все заголовочные файлы, найденные по пути включения в zip-файл (вместо минимальных заголовочных файлов, необходимых для создания кода). Например, packNGo(buildInfo,'minimalHeaders',false).

Код, сгенерированный пакетом с помощью кодера графического процессора

В этом примере показано, как упаковывать созданный код в zip-файл для перемещения с помощью опции Package в приложении GPU Coder. В примере для демонстрации этой концепции используется приложение Sobel edge detection. По умолчанию кодер графического процессора создает zip-файл в текущей рабочей папке.

Предпосылки

Функция точки входа Sobel Edge Detection

В алгоритме обнаружения краев Собеля выполняется операция 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). После операции фильтрации алгоритм вычисляет величину градиента и применяет пороговое значение для поиска областей изображений, которые считаются краями.

Запустить алгоритм обнаружения краев 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 и связанный с ним файл заголовка main_sobel.h. Этот пользовательский основной файл считывает входной образ из inputImage.csv файл, вызывает sobelEdge функция в сгенерированном sobelEdge.cu и сохраняет данные из обнаруженного изображения края в outputMag.csv файл.

Код, созданный пакетом с помощью приложения кодера графического процессора

Откройте приложение Кодер графического процессора. На вкладке Приложения MATLAB Toolstrip в разделе Создание кода щелкните значок приложения Кодер графического процессора.

На странице «Выбор исходных файлов» введите имя функции точки входа. sobelEdge.m. Щелкните Далее (Next), чтобы перейти на страницу Определение типов ввода (Define Input Types).

Укажите, что входные данные Image имеет двойной тип данных и переменный размер с верхней границей 1024. Чтобы задать переменный размер с верхней границей 1024, выберите :1024. Нажмите кнопку Далее, чтобы перейти на страницу Проверка ошибок времени выполнения.

Проверьте наличие проблем во время выполнения. В диалоговом окне Проверка ошибок времени выполнения введите код вызова sobelEdge с двойным входом. Например, sobelEdge(ones(648,484)). Щелкните Проверить наличие проблем. Чтобы проверить наличие проблем во время выполнения, приложение генерирует и запускает функцию MEX. Приложение не находит проблем для sobelEdge. Нажмите кнопку Далее, чтобы перейти на страницу Создание кода.

В диалоговом окне «Создание» установите для параметра «Тип сборки» значение «Исполняемый файл». Также можно упаковать код, созданный для целевых объектов исходного кода, статической библиотеки или динамической библиотеки. Невозможно упаковать код, созданный для целей MEX. Щелкните Дополнительные параметры.

На вкладке «Пользовательский код» в разделе «Пользовательский код C» для параметра «Созданные файлы» задайте для параметра «Дополнительные исходные файлы» значение main_sobel.cu. Нажмите кнопку Закрыть, чтобы перейти на страницу Создать код.

Щелкните Создать (Generate). Нажмите кнопку Далее, чтобы перейти на страницу Завершить рабочий процесс. На странице Завершение рабочего процесса щелкните Пакет.

В диалоговом окне «Пакет» укажите имя и тип файла пакета. По умолчанию приложение извлекает имя файла пакета из имени проекта. Приложение сохраняет файл в текущей рабочей папке. По умолчанию приложение упаковывает созданные файлы в одну плоскую папку. В этом примере используйте значения по умолчанию и нажмите кнопку Сохранить.

Этот zip-файл содержит код CUDA C++ и заголовочные файлы, необходимые для перемещения. Он не содержит:

  • Компиляция флагов

  • Определяет

  • Makefiles

  • Пример основных файлов, если не настроить создание кода для создания и компиляции примера основной функции.

Проверить содержимое 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 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 функция.

КомуОпределить

Измените структуру упаковки файлов на иерархическую.

packNGo(buildInfo,'packType','hierarchical');

Измените структуру упаковки файлов на иерархическую и переименуйте основной zip-файл.

packNGo(buildInfo,'packType','hierarchical',...
'fileName','zippedsrcs');

Включить все заголовочные файлы, найденные по пути включения в zip-файл (вместо минимальных заголовочных файлов, необходимых для создания кода).

Для кодера графического процессора этот параметр должен иметь значение false.

packNGo(buildInfo,'minimalHeaders',false);

Создание предупреждений об ошибках синтаксического анализа и отсутствующих файлах.

packNGo(buildInfo,'ignoreParseError', true,...
'ignoreFileMissing',true);

Дополнительные сведения см. в разделе packNGo.

Выбор структуры для ZIP-файла

Прежде чем создавать и упаковывать файлы, решите, следует ли упаковывать файлы в плоскую или иерархическую структуру папок. По умолчанию packNGo функция упаковывает файлы в единую плоскую структуру папок. Этот подход является самым простым и может быть оптимальным выбором.

ЕслиИспользовать
Выполняется перемещение файлов в среду IDE, в которой не используется созданный make-файл, или код не зависит от относительного расположения требуемых статических файлов. Единая, плоская структура папок
Целевая среда разработки должна поддерживать структуру папок исходной среды, поскольку она использует созданный make-файл, или код зависит от относительного расположения файловИерархическая структура

При использовании иерархической структуры packNGo создает два уровня zip-файлов. Существует первичный zip-файл, который, в свою очередь, содержит следующие вторичные zip-файлы:

  • mlrFiles.zip - файлы в вашем matlabroot дерево папок

  • sDirFiles.zip - файлы в папке сборки и под ней, где вы инициировали создание кода

  • otherFiles.zip - обязательные файлы, отсутствующие в matlabroot или start деревья папок

Пути для вторичных zip-файлов относятся к корневой папке первичного zip-файла с сохранением структуры исходной папки разработки.

См. также

Функции

Связанные темы