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

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

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

Примечание

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

Сгенерированный код пакета Используя GPU Coder

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

Необходимые условия

Функция точки входа обнаружения ребра Sobel

В алгоритме обнаружения ребра Sobel выполняется 2D пространственная операция градиента на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, который соответствует ребрам.

type sobelEdge.m
function [ magnitude ] = sobelEdge( Image )
%#codegen

%   Copyright 2017-2021 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 функция.

КЗадать

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

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

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

packNGo (buildInfo, 'packType', 'иерархический'...
'имя файла', 'zippedsrcs');

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

Для GPU Coder эта опция должна быть установлена в ложь.

packNGo(buildInfo,'minimalHeaders',false);

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

packNGo (buildInfo, 'ignoreParseError', верный...
'ignoreFileMissing', верный);

Для получения дополнительной информации смотрите packNGo.

Выберите структуру для zip-файла

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

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

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

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

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

  • otherFiles.zip — необходимые файлы не в matlabroot или start деревья папки

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

Смотрите также

Функции

Похожие темы