В этом примере показано, как использовать MATLAB® Coder™ Support Package для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами со встроенными платами от NVIDIA®. Пример использует алгоритм сложения простого вектора, чтобы проиллюстрировать:
Связь со встроенной платой средой MATLAB.
Выполните основные операции, такие как передача файлов к и из MATLAB и выполняющихся команд интерпретатора Linux® на плате.
Сгенерируйте исполняемый файл C++ от функции MATLAB и запустите исполняемый файл на центральном процессоре ARM® в плате.
Сгенерируйте исполняемый файл CUDA® от функции MATLAB и запустите исполняемый файл на графическом процессоре NVIDIA в плате.
Требования требуемой платы
ДИСК NVIDIA PX2 или Джетсон встроил платформу.
Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если вы не можете соединить требуемую плату с локальной сетью).
NVIDIA инструментарий CUDA и библиотеки установлен на плате.
Переменные окружения на цели для компиляторов и библиотек. Для получения дополнительной информации смотрите Необходимые условия Установки и Setup для Советов NVIDIA (Пакет поддержки MATLAB Coder для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами).
Требования узла разработки
MATLAB Coder для генерации Кода С++. Для примера смотрите Начало работы с MATLAB Coder.
GPU Coder для генерации кода CUDA. Для примера смотрите Начало работы с GPU Coder.
Для генерации кода CUDA, NVIDIA инструментарий CUDA на хосте и переменных окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Следующая строка кода создает папку в вашей текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если вы не можете сгенерировать файлы в этой папке, прежде, чем запустить эту команду, изменить вашу текущую рабочую папку.
nvidiademo_setup('nvidia_gettingstarted');
Пакет поддержки использует связь SSH по TCP/IP, чтобы выполнить команды при создании и выполнении сгенерированного кода на платформах ДИСКА или Джетсоне. Соедините целевую платформу с той же сетью как хост - компьютер или используйте кабель перекрестного соединения Ethernet, чтобы соединить плату непосредственно с хостом - компьютером. Для получения информации о том, как настроить и сконфигурировать вашу плату, видит документацию NVIDIA.
Чтобы связаться с оборудованием NVIDIA, создайте живой аппаратный объект связи при помощи drive
(Пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ платформами), или jetson
(Пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ Платформами), функция. Необходимо знать, что имя хоста или IP-адрес, имя пользователя и пароль требуемой платы создают живой аппаратный объект связи. Например, при соединении с требуемой платой впервые, создайте живой объект для оборудования Джетсона при помощи команды:
hwobj = jetson('jetson-tx2-name','ubuntu','ubuntu');
Во время оборудования живое создание объекта пакет поддержки выполняет аппаратные и программные проверки, установку сервера IO, и собирает периферийную информацию о цели. Эта информация отображена в Командном окне.
Точно так же, чтобы создать живой объект для оборудования ДИСКА, используйте команду:
hwobj = drive('drive-px2-name','ubuntu','ubuntu');
В случае отказа связи о сообщении об ошибке диагностики сообщают в командной строке MATLAB. Если связь прервалась, наиболее вероятной причиной является неправильный IP-адрес или имя хоста.
Когда успешная связь с платой устанавливается, можно использовать системный метод объекта платы выполнить различные команды интерпретатора Linux на оборудовании NVIDIA из MATLAB. Например, чтобы перечислить содержимое домашней папки на требуемой плате, используйте команду:
system(hwobj,'ls -al ~');
Аппаратный объект предусматривает основные возможности манипуляции с файлами. Чтобы передать файлы от хоста до цели используют putFile()
метод живого аппаратного объекта. Например, чтобы передать test.txt
файл в текущей папке к remoteBuildDir
на требуемой плате используйте команду:
putFile(hwobj,'test.txt','~/remoteBuildDir');
Чтобы скопировать файл от требуемой платы до хоста - компьютера, используйте getFile()
метод аппаратного объекта. Например,
getFile(hwobj,'~/remoteBuildDir/test.txt','.');
Этот пример использует myAdd.m
, сложение простого вектора, как точка входа функционируют для генерации кода.
function out = myAdd(inp1,inp2) %#codegen % Simple vector addition % Copyright 2018-2021 The MathWorks, Inc. out = inp1 + inp2; end
Чтобы сгенерировать исполняемый файл, который можно развернуть на цели NVIDIA, создайте объект настройки кода для генерации исполняемого файла.
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
Когда существует несколько живых объектов связи для различных целей, генератор кода выполняет удаленную сборку на требуемой плате, для которой был создан недавний живой объект. Чтобы выбрать аппаратное управление по выполнению удаленной сборки, используйте setupCodegenContext()
метод соответствующего живого аппаратного объекта. Если только один живой объект связи был создан, вы не должны вызывать этот метод.
hwobj.setupCodegenContext;
Чтобы создать настройку возражают для ДИСКА или платформы Джетсона и присвоить его Hardware
свойство объекта cfg
настройки кода, используйте
coder.hardware
функция. Используйте 'NVIDIA Jetson'
для плат Джетсона и 'NVIDIA Drive'
для платы ДИСКА.
cfg.Hardware = coder.hardware('NVIDIA Jetson');
Чтобы задать папку для выполнения удаленного процесса сборки на требуемой плате, используйте BuildDir
свойство. Если заданная папка сборки не существует на требуемой плате, то программное обеспечение создает папку с именем. Если никакое значение не присвоено cfg.Hardware.BuildDir
, удаленный процесс сборки происходит в последней заданной папке сборки. Если нет никакого сохраненного значения папки сборки, процесс сборки происходит в домашней папке.
cfg.Hardware.BuildDir = '~/remoteBuildDir';
Пользовательский main.cpp
файл является оберткой, которая вызывает функцию точки входа в сгенерированном коде. Этот основной файл передает вектор, содержащий первые 100 натуральных чисел к функции точки входа. Основной файл пишет результаты в myAdd.bin
двоичный файл.
cfg.CustomSource = fullfile('main.cpp');
Чтобы сгенерировать Код С++, используйте codegen
функционируйте и передайте настройку кода и размер входных параметров для и myAdd.m
функция точки входа. После того, как генерация кода происходит на хосте, сгенерированные файлы скопированы и основаны на требуемой плате.
codegen('-config ',cfg,'myAdd','-args',{1:100,1:100});
Проверьте среду графического процессора в требуемой плате
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall
функция.
% Use 'drive' for NVIDIA DRIVE hardware envCfg = coder.gpuEnvConfig('jetson'); envCfg.BasicCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
Сгенерируйте исполняемый файл CUDA
Чтобы сгенерировать исполняемый файл CUDA, который можно развернуть на цели NVIDIA, создайте объект настройки графического процессора кода для генерации исполняемого файла.
cfg = coder.gpuConfig('exe'); cfg.Hardware = coder.hardware('NVIDIA Jetson'); cfg.Hardware.BuildDir = '~/remoteBuildDir'; cfg.CustomSource = fullfile('main.cu');
Определенные платформы NVIDIA, такие как ДИСК PX2 содержат несколько графических процессоров. На таких платформах используйте SelectCudaDevice
свойство в настройке графического процессора возражает, чтобы выбрать определенный графический процессор.
cfg.GpuConfig.SelectCudaDevice = 0;
codegen('-config ',cfg,'myAdd','-args',{1:100,1:100});
Чтобы запустить исполняемый файл на целевом компьютере, используйте runApplication()
метод аппаратного объекта.
pid = runApplication(hwobj,'myAdd');
В качестве альтернативы, чтобы запустить исполняемый файл, используйте runExecutable()
метод аппаратного объекта.
exe = [hwobj.workspaceDir '/myAdd.elf'];
pid = runExecutable(hwobj,exe);
Скопируйте выходной файл интервала myAdd.bin
к среде MATLAB на хосте и сравнивают вычисленные результаты с теми из MATLAB. Свойство workspaceDir
содержит путь к codegen
папка на требуемой плате.
pause(0.3); % To ensure that the executable completed the execution. getFile(hwobj,[hwobj.workspaceDir '/myAdd.bin']);
Результат симуляции из MATLAB:
simOut = myAdd(0:99,0:99);
Считайте скопированный двоичный файл результата из цели в MATLAB:
fId = fopen('myAdd.bin','r'); tOut = fread(fId,'double');
Найдите различие между симуляцией MATLAB выходом и выходом с требуемой платы.
diff = simOut - tOut';
Отобразите максимальное отклонение между симуляцией выход и выходом с требуемой платы.
fprintf('Maximum deviation between MATLAB Simulation output and the output on Target is: %f\n', max(diff(:)));
Чтобы удалить файлы в качестве примера и возвратиться к исходной папке, вызовите cleanup
функция.
cleanup
jetson
(Пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ платформами), | drive
(Пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ платформами),