В этом примере показано использование пакета MATLAB ® Coder™ Support Package для платформ NVIDIA Jetson и NVIDIA DRIVE с встроенными платами от NVIDIA ®. Пример использует простой алгоритм сложения векторов, чтобы проиллюстрировать:
Подключение к встроенной плате из окружения MATLAB.
Выполните основные операции, такие как передача файлов в MATLAB и из него, а также выполнение команд интерпретатора Linux ® на плате.
Сгенерируйте исполняемый файл C++ из функции MATLAB и запустите исполняемый файл на центральном процессоре ARM ® на плате.
Сгенерируйте исполняемый файл CUDA ® из функции MATLAB и запустите исполняемый файл на графическом процессоре NVIDIA на плате.
Требования к целевой плате
NVIDIA DRIVE PX2 или встроенная платформа Jetson.
Перекрестный кабель Ethernet для подключения целевой платы и хост-ПК (если вы не можете подключить целевую плату к локальной сети).
На плате установлен набор инструментов и библиотек NVIDIA CUDA.
Переменные окружения целевого компьютера для компиляторов и библиотек. Для получения дополнительной информации см. раздел Установка и Setup Необходимых условий для плат NVIDIA (MATLAB CODER пакет поддержки для платформ NVIDIA Jetson и NVIDIA DRIVE).
Требования к узлу разработки
MATLAB Coder для генерации кода С++. Для получения руководства «Запуск с MATLAB Coder».
GPU Coder для генерации кода CUDA. Для получения руководства «Запуск с GPU Coder».
Для генерации кода CUDA, набор инструментов NVIDIA CUDA на хосте и переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Следующая строка кода создает папку в текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если вы не можете сгенерировать файлы в этой папке, перед запуском этой команды измените текущую рабочую папку.
nvidiademo_setup('nvidia_gettingstarted');
Пакет поддержки использует SSH-соединение через TCP/IP для выполнения команд во время создания и выполнения сгенерированного кода на платформах Jetson или DRIVE. Подключите целевую платформу к той же сети, что и хосту-компьютеру, или используйте перекрестный кабель Ethernet, чтобы подключить плату непосредственно к хосту-компьютеру. Для получения информации о настройке и конфигурировании системной платы см. документацию NVIDIA.
Для связи с оборудованием NVIDIA создайте объект подключения к активному оборудованию с помощью drive
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) или jetson
(MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms). Для создания объекта подключения к активному оборудованию необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте объект live для оборудования Jetson с помощью команды:
hwobj = jetson('jetson-tx2-name','ubuntu','ubuntu');
Во время создания оборудования объект пакет поддержки выполняет проверку аппаратных и программного оборудования, установку сервера ввода-вывода и собирает периферийную информацию для целевого устройства. Эта информация отображается в Командном окне.
Точно так же, чтобы создать объект live для оборудования DRIVE, используйте команду:
hwobj = drive('drive-px2-name','ubuntu','ubuntu');
В случае отказа соединения в командной строке MATLAB выводится сообщение об ошибке диагностики. Если подключение не удалось, наиболее вероятной причиной является неправильный IP-адрес или имя узла.
При установлении успешного подключения к плате можно использовать системный метод объекта платы для выполнения различных команд интерпретатора Linux на оборудовании NVIDIA из MATLAB. Для примера списка содержимого домашней папки на целевой плате используйте команду:
system(hwobj,'ls -al ~');
Аппаратный объект обеспечивает основные возможности манипуляции файлами. Чтобы перенести файлы с хоста на целевой, используйте putFile()
метод объекта live hardware. Например, для переноса 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++';
Когда существует несколько объектов live connection для разных целей, генератор кода выполняет удаленную сборку на целевой плате, для которой был создан недавний объект live. Чтобы выбрать плату оборудования для выполнения удаленной сборки, используйте setupCodegenContext()
способ соответствующего объекта оборудование. Если был создан только один объект live connection, вам не нужно вызывать этот метод.
hwobj.setupCodegenContext;
Чтобы создать объект строения для платформы DRIVE или Jetson и назначить его Hardware
свойство объекта строения кода cfg
, используйте coder.hardware
функция. Использование 'NVIDIA Jetson'
для плат и 'NVIDIA Drive'
Jetson для платы 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, создайте объект строения кода GPU для генерации исполняемого файла.
cfg = coder.gpuConfig('exe'); cfg.Hardware = coder.hardware('NVIDIA Jetson'); cfg.Hardware.BuildDir = '~/remoteBuildDir'; cfg.CustomSource = fullfile('main.cu');
Некоторые платформы NVIDIA, такие как DRIVE 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
drive
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) | jetson
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE)