В этом примере показано, как использовать пакет поддержки 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).
Требования к хосту разработки
Кодер MATLAB для генерации кода C++. Учебное пособие см. в разделе Начало работы с кодером MATLAB.
Кодер графического процессора для генерации кода CUDA. Учебное пособие см. в разделе Начало работы с кодером графического процессора.
Для создания кода CUDA, инструментарий NVIDIA CUDA содержит переменные хоста и среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Следующая строка кода создает папку в текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если невозможно создать файлы в этой папке, перед выполнением этой команды измените текущую рабочую папку.
nvidiademo_setup('nvidia_gettingstarted');
Пакет поддержки использует 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 из 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;
Чтобы создать объект конфигурации для платформы 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});
Проверка среды графического процессора на целевой плате
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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
drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) | jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE)