В этом примере показано, как использовать Пакет Поддержки GPU Coder™ для NVIDIA графические процессоры и соединиться с NVIDIA® DRIVE™ и аппаратными платформами Джетсона, выполните основные операции, сгенерируйте исполняемый файл CUDA® от функции MATLAB® и запустите исполняемый файл на оборудовании. Этот пример использует сложение простого вектора.
Требования требуемой платы
ДИСК NVIDIA PX2 или Jetson TX1/TX2 встроил платформу.
Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если вы не можете соединить требуемую плату с локальной сетью).
NVIDIA инструментарий CUDA установлен на плате.
Переменные окружения на цели для компиляторов и библиотек. Для получения дополнительной информации смотрите Необходимые условия Установки и Setup для Советов NVIDIA (Пакет Поддержки GPU Coder для NVIDIA графические процессоры).
Требования узла разработки
GPU Coder для генерации кода CUDA. Для примера смотрите Начало работы с GPU Coder.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте MATLAB® Add-On Explorer
.
NVIDIA инструментарий CUDA на хосте.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Следующая строка кода создает папку в вашей текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если вы не можете сгенерировать файлы в этой папке, прежде, чем запустить эту команду, изменить вашу текущую рабочую папку.
gpucoderdemo_setup('nvidia_gettingstarted');
Пакет Поддержки GPU Coder для NVIDIA графические процессоры использует связь SSH по TCP/IP, чтобы выполнить команды при создании и выполнении сгенерированного кода CUDA по платформам Джетсона или ДИСКУ. Соедините целевую платформу с той же сетью как хост - компьютер или используйте кабель перекрестного соединения Ethernet, чтобы соединить плату непосредственно с хостом - компьютером. Для получения информации о том, как настроить и сконфигурировать вашу плату, видит документацию NVIDIA.
Чтобы связаться с оборудованием NVIDIA, создайте живой аппаратный объект связи при помощи drive
(Пакет поддержки GPU Coder для NVIDIA графические процессоры) или jetson
(Пакет Поддержки GPU Coder для 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','.');
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('jetson'); % Use 'drive' for NVIDIA DRIVE hardware envCfg.BasicCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
Этот пример использует myAdd.m
, сложение простого вектора, как точка входа функционируют для генерации кода. Чтобы сгенерировать исполняемый файл CUDA, который можно развернуть на цели NVIDIA, создайте объект настройки графического процессора кода для генерации исполняемого файла. cfg = coder.gpuConfig ('exe');
Когда существует несколько живых объектов связи для различных целей, генератор кода выполняет удаленную сборку на требуемой плате, для которой был создан недавний живой объект. Чтобы выбрать аппаратное управление по выполнению удаленной сборки, используйте setupCodegenContext()
метод соответствующего живого аппаратного объекта. Если только один живой объект связи был создан, вы не должны вызывать этот метод.
hwobj.setupCodegenContext;
Чтобы создать настройку возражают для ДИСКА или платформы Джетсона и присвоить его Hardware
свойство объекта cfg
настройки кода, используйте
coder.hardware
функция. Используйте 'NVIDIA Jetson'
для Jetson TX1 или плат TX2 и 'NVIDIA Drive'
для платы ДИСКА. cfg.Hardware = coder.hardware ('NVIDIA Джетсон');
Чтобы задать папку для выполнения удаленного процесса сборки на требуемой плате, используйте BuildDir
свойство. Если заданная папка сборки не существует на требуемой плате, то программное обеспечение создает папку с именем. Если никакое значение не присвоено cfg.Hardware.BuildDir
, удаленный процесс сборки происходит в последней заданной папке сборки. Если нет никакого сохраненного значения папки сборки, процесс сборки происходит в домашней папке. cfg.Hardware.BuildDir = '~/remoteBuildDir';
Определенные платформы NVIDIA, такие как ДИСК PX2 содержат несколько графических процессоров. На таких платформах используйте SelectCudaDevice
свойство в настройке графического процессора возражает, чтобы выбрать определенный графический процессор.
cfg.GpuConfig.SelectCudaDevice = 0;
Пользовательский main.cu
файл является оберткой, которая вызывает функцию точки входа в сгенерированном коде. Этот основной файл передает вектор, содержащий первые 100 натуральных чисел к функции точки входа. Основной файл пишет результаты в myAdd.bin
двоичный файл.
cfg.CustomSource = fullfile('main.cu');
Чтобы сгенерировать код CUDA, используйте codegen
функционируйте и передайте настройку графического процессора кода и размер входных параметров для и myAdd.m
функция точки входа. После того, как генерация кода происходит на хосте, сгенерированные файлы скопированы и основаны на требуемой плате.
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 выходом и Кодером GPU выход с требуемой платы.
diff = simOut - tOut';
Отобразите максимальное отклонение между симуляцией выход и Кодером GPU выход с требуемой платы.
fprintf('Maximum deviation between MATLAB Simulation output and GPU coder output on Target is: %f\n', max(diff(:)));
Чтобы удалить файлы в качестве примера и возвратиться к исходной папке, вызовите cleanup
функция.
cleanup