Начало работы с пакетом поддержки MATLAB Coder для платформ NVIDIA Jetson и NVIDIA DRIVE

В этом примере показано использование пакета 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).

Требования к узлу разработки

Создайте папку и скопируйте соответствующие файлы

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

nvidiademo_setup('nvidia_gettingstarted');

Подключение к оборудованию NVIDIA

Пакет поддержки использует 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

При установлении успешного подключения к плате можно использовать системный метод объекта платы для выполнения различных команд интерпретатора Linux на оборудовании NVIDIA из MATLAB. Для примера списка содержимого домашней папки на целевой плате используйте команду:

system(hwobj,'ls -al ~');

Аппаратный объект обеспечивает основные возможности манипуляции файлами. Чтобы перенести файлы с хоста на целевой, используйте putFile() метод объекта live hardware. Например, для переноса test.txt файл в текущей папке в remoteBuildDir на целевой плате используйте команду:

putFile(hwobj,'test.txt','~/remoteBuildDir');

Чтобы скопировать файл с целевой платы на хост-компьютер, используйте getFile() метод аппаратного объекта. Для примера,

getFile(hwobj,'~/remoteBuildDir/test.txt','.');

Сгенерируйте код С++ для центрального процессора ARM с помощью MATLAB Coder

Этот пример использует 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});

Сгенерируйте код CUDA для целевой платы с помощью GPU Coder

Проверьте окружение графического процессора на целевой плате

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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

См. также

Объекты

  • (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) | (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE)

Похожие темы