Начало работы с пакетом поддержки GPU Coder для NVIDIA графические процессоры

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

Предпосылки

Требования требуемой платы

  • ДИСК NVIDIA PX2 или Jetson TX1/TX2 встроил платформу.

  • Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если требуемая плата не может быть соединена с локальной сетью).

  • NVIDIA инструментарий CUDA установлен на плате.

  • Переменные окружения на цели для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек и их настройки, смотрите предпосылки установки и подготовки для плат NVIDIA.

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

  • GPU Coder™ для генерации кода. Для обзора и примеров, посетите страницу продукта GPU Coder.

  • NVIDIA инструментарий CUDA на хосте.

  • Переменные окружения на хосте к компиляторам и библиотекам. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.

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

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

gpucoderdemo_setup('nvidia_gettingstarted');

Свяжите с оборудованием NVIDIA

Пакет Поддержки GPU Coder для NVIDIA графические процессоры использует связь SSH по TCP/IP, чтобы выполнить команды при создании и выполнении сгенерированного кода CUDA по платформам Джетсона или ДИСКУ. Необходимо поэтому соединить целевую платформу с той же сетью как хост - компьютер или использовать кабель перекрестного соединения Ethernet, чтобы соединить плату непосредственно с хостом - компьютером. Обратитесь к документации NVIDIA относительно того, как настроить и сконфигурировать вашу плату.

Чтобы связаться с оборудованием NVIDIA, необходимо создать живой аппаратный объект связи при помощи функции jetson или диска. Необходимо знать, что имя хоста или 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 на цели.

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

И скопировать файл от цели до хоста - компьютера, используйте getFile() метод аппаратного объекта. Например, следующая команда передает файл test.txt в remoteBuildDir директория на цели к current directory на хосте.

hwobj.getFile('~/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);

Сгенерируйте код CUDA для цели Используя GPU Coder

Этот пример использует myAdd.m, сложение простого вектора как функция точки входа для генерации кода. Чтобы сгенерировать исполняемый файл CUDA, который может развернутый на цели NVIDIA, создайте объект настройки графического процессора кода для генерации исполняемого файла.

cfg = coder.gpuConfig('exe');

Когда существует несколько живых объектов связи для различных целей, генератор кода выполняет удаленную сборку на цели, для которой был создан недавний живой объект. Чтобы выбрать аппаратное управление по выполнению удаленной сборки, используйте setupCodegenContext() метод соответствующего живого аппаратного объекта. Если только один живой объект связи был создан, не необходимо вызвать этот метод.

hwobj.setupCodegenContext;

Используйте функцию coder.hardware, чтобы создать объект настройки для ДИСКА или платформы Джетсона и присвоить его Hardware свойство объекта cfg настройки кода. Используйте 'NVIDIA Jetson' для Jetson TX1 или плат TX2 и 'NVIDIA Drive' для платы ДИСКА.

cfg.Hardware = coder.hardware('NVIDIA Jetson');

Используйте BuildDir свойство задать директорию для выполнения удаленного процесса сборки на цели. Если заданный каталог сборки не существует на цели затем, программное обеспечение создает директорию с именем. Если никакое значение не присвоено cfg.Hardware.BuildDir, удаленный процесс сборки происходит в последнем заданном каталоге сборки. Если нет никакого сохраненного значения каталога сборки, процесс сборки происходит в корневом каталоге.

cfg.Hardware.BuildDir = '~/remoteBuildDir';

Определенные платформы NVIDIA, такие как ДИСК PX2 содержат несколько графических процессоров. На таких платформах используйте SelectCudaDevice свойство в настройке графического процессора возражает, чтобы выбрать определенный графический процессор.

cfg.GpuConfig.SelectCudaDevice = 0;

Пользовательский основной файл является оберткой, которая вызывает функцию точки входа в сгенерированном коде. Основной файл передает вектор, содержащий первые 100 натуральных чисел к точке входа. Это пишет результаты в 'myAdd.bin' двоичный файл.

cfg.CustomSource  = fullfile('main.cu');

Чтобы сгенерировать код CUDA, используйте codegen, функционируют и передают настройку графического процессора кода наряду с размером входных параметров для и myAdd функция точки входа. После того, как генерация кода происходит на хосте, сгенерированные файлы скопированы и основаны на цели.

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

Запустите исполняемый файл на цели

Используйте runApplication() метод оборудования возражает, чтобы запустить exectuable на целевом компьютере.

pid = hwobj.runApplication('myAdd');

В качестве альтернативы можно использовать runExecutable() метод оборудования возражает, чтобы запустить исполняемый файл.

exe = [hwobj.workspaceDir '/myAdd.elf'];
pid = hwobj.runExecutable(exe);

Проверьте результат цели

Скопируйте выходной файл интервала myAdd.bin к среде MATLAB на хосте и сравнивают вычисленные результаты с теми из MATLAB. Свойство workspaceDir содержит путь к codegen папка на цели.

pause(0.3); % To ensure that the executable completed the execution.
hwobj.getFile([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