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

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

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

Примечание

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

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

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

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

Функция точки входа обнаружения ребер 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 функция.

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

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

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

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

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

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

Для GPU Coder эта опция должна быть установлена на 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- файла, поддерживая структуру исходной папки разработки.

См. также

Функции

Похожие темы