exponenta event banner

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

В этом примере показано, как использовать пакет поддержки MATLAB ® Coder™ для платформ NVIDIA Jetson и NVIDIA DRIVE со встроенными платами NVIDIA ®. В примере используется простой алгоритм векторного сложения для иллюстрации:

  • Подключение к встроенной плате из среды MATLAB.

  • Выполните основные операции, такие как передача файлов в MATLAB и из MATLAB и выполнение команд оболочки Linux ® на плате.

  • Создайте исполняемый файл C++ из функции MATLAB и запустите исполняемый файл на процессоре ARM ® на плате.

  • Создайте исполняемый файл CUDA ® из функции MATLAB и запустите исполняемый файл на графическом процессоре NVIDIA в плате.

Предпосылки

Требования к целевой плате

  • Встроенная платформа NVIDIA DRIVE PX2 или Jetson.

  • Кросс-кабель Ethernet для подключения целевой платы и хост-ПК (если невозможно подключить целевую плату к локальной сети).

  • Набор инструментов NVIDIA CUDA и библиотеки, установленные на плате.

  • Переменные среды в целевом объекте для компиляторов и библиотек. Дополнительные сведения см. в разделе Предварительные условия установки и установки плат NVIDIA (пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE).

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

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

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

nvidiademo_setup('nvidia_gettingstarted');

Подключение к аппаратному обеспечению NVIDIA

Пакет поддержки использует SSH-соединение по TCP/IP для выполнения команд при создании и выполнении сгенерированного кода на платформах Jetson или DRIVE. Подключите целевую платформу к той же сети, что и хост-компьютер, или используйте кросс-кабель Ethernet для подключения платы непосредственно к хост-компьютеру. Для получения информации о настройке и настройке платы см. документацию по NVIDIA.

Для связи с аппаратным обеспечением NVIDIA создайте объект подключения аппаратного обеспечения в реальном времени с помощью drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) или jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE). Для создания объекта аппаратного подключения в реальном времени необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте активный объект для оборудования Jetson с помощью команды:

hwobj = jetson('jetson-tx2-name','ubuntu','ubuntu');

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

Аналогичным образом, чтобы создать живой объект для оборудования DRIVE, используйте команду:

hwobj = drive('drive-px2-name','ubuntu','ubuntu');

В случае сбоя соединения в командной строке MATLAB появляется сообщение об ошибке диагностики. В случае сбоя подключения наиболее вероятной причиной является неправильный IP-адрес или имя узла.

Выполнение команд Linux на оборудовании NVIDIA

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

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

Аппаратный объект обеспечивает основные возможности управления файлами. Для передачи файлов с хоста на конечный объект используйте putFile() СПОСОБ АКТИВНОГО АППАРАТНОГО ОБЪЕКТА. Например, для переноса test.txt в текущей папке в remoteBuildDir на целевой плате используйте команду:

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

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

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

Создание кода C++ для процессора ARM с помощью кодера MATLAB

В этом примере используется 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;

Чтобы создать объект конфигурации для платформы DRIVE или Jetson и назначить его Hardware свойство объекта конфигурации кода cfg, используйте coder.hardware функция. Использовать 'NVIDIA Jetson' для плат Jetson и 'NVIDIA Drive' для платы 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');

Для создания кода C++ используйте codegen и передать конфигурацию кода и размер входов для и myAdd.m функция точки входа. После создания кода на хосте созданные файлы копируются и создаются на целевой плате.

codegen('-config ',cfg,'myAdd','-args',{1:100,1:100});

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

Проверка среды графического процессора на целевой плате

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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, такие как 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 для платформ NVIDIA Jetson и NVIDIA DRIVE) | (Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE)

Связанные темы