GPU Coder - инструмент генерации оптимизированного CUDA кода из кода MATLAB для задач глубокого обучения, обработки изображений и систем автономного вождения.
Использование GPU Coder совместно с Embedded Coder дает вам возможность проверять поведение сгенерированного кода на его численную эквивалентность эталонной модели при помощи тестирования в режиме «Программа в контуре» (SIL).
Перевод кода MATLAB в CUDA код на первом шаге включает в себя задание ряда требований к реализации алгоритма, например, задание размерности и типа входных данных. Приложение GPU Coder или интерфейс его командной строки проведет вас в интерактивном режиме через все шаги процесса генерации кода, оставляя вас в рамках уже знакомой среды MATLAB.
GPU Coder помогает вам подготовить алгоритм к генерации CUDA кода. GPU Coder анализирует ваш MATLAB код и автоматически предлагает подходящие типы данных и их размерность для входных переменных. Вы можете предварительно убедиться, что ваш алгоритм готов к генерации кода, сгенерировав из него MEX функцию, которая упаковывает скомпилированный код для вызова его внутри MATLAB. При генерации кода GPU Coder создает отчет о генерации кода, в котором указывает возникающие ошибки, если они есть, которые необходимо устранить, чтобы подготовить алгоритм MATLAB к генерации CUDA кода. После вы устраняете ошибки и заново пробуете сгенерировать MEX функцию и так несколько раз до тех пор, пока ваш алгоритм не будет готов к генерации кода.
После вы можете генерировать CUDA код из вашего алгоритма MATLAB в виде исходного CUDA C кода, статической или динамической библиотеки, или в виде MEX функции для повышения производительности и ускорения вычисления вашего MATLAB кода. Сгенерированный код может использоваться в таких приложениях, как глубокое обучение, компьютерное зрение и системы автономного вождения.
Используйте GPU Coder совестно с Deep Learning Toolbox для развертывания обученных нейронных сетей на графических процессорах NVIDIA, таких как Tesla и Tegra. Используйте метод передачи обучения для переобучения существующих сетей: AlexNet или VGG-16/19 для решения ваших задач.
Например, вы можете классифицировать только те объекты из набора, которые являются наиболее важными для вас, вместо 1000 объектов, на которых изначально обучалась сеть. Также есть возможность с нуля создать архитектуру нейронной сети и обучить сеть для новой задачи, предварительно собрав базу данных с метками для обучения сети.
Помимо обученной нейронной сети, GPU Coder также может генерировать код для предварительной и постобработки данных, поэтому на выходе вы получаете готовый алгоритм для решения вашей задачи. Например, вам может потребоваться предварительное повышение контраста для входного изображения. После предобработанные изображения можно подавать на вход нейронных сетей AlexNet или VGG-16 для детектирования и классификации объектов.
Обучение нейронной сети может занять много времени, от нескольких дней до недель. С Parallel Computing Toolbox вы можете использовать GPU ядра на своем компьютере, на кластере или в облаке, чтобы значительно сократить время обучения сети и ускорить сам процесс. Использование GPU ядер может сократить время обучения сети для задачи классификации изображений с нескольких дней до часов.
GPU Coder создает CUDA ядра, которые минимизируют пересылку данных в памяти между CPU и GPU и оптимизируют использование памяти на GPU. GPU Coder автоматически анализирует и идентифицирует код и автоматически выделяет сегменты кода MATLAB для запуска на CPU и на GPU. При желании пользователи могут с помощью специальных прагм вручную указать весь код или его часть для запуска на GPU. Код MATLAB, распознанный для запуска на GPU, преобразуется в CUDA ядра и создается из таких программных конструкций, как циклы FOR, поэлементные матричные операции, векторные операции, операции, редукции и т.д. и алгоритмы более высокого уровня, такие как БПФ и функции обработки изображений.
GPU Coder анализирует зависимость данных CPU - GPU ядра, данные используемые совместно процессором и графическим процессором, располагаться в памяти графического процессора с помощью функций cudaMalloc или cudaMallocManaged. GPU Coder определяет минимальное число мест, где данные должны быть скопированы между CPU и GPU с помощью функций cudaMemcpy. Если вы используете общую память в CUDA, GPU Coder также определяет минимальное число вызовов функции cudaDeviceSync, необходимой для корректного поведения кода. GPU Coder поддерживает различные пространства памяти GPU, от локальной до глобальной памяти. В каждом ядре GPU Coder отображает данные в область памяти для увеличения пропускной способности памяти.
Сгенерированный код использует оптимизированные библиотеки NVIDIA CUDA, включая TensorRT, cuDNN, cuSolver, cuFFT, cuBLAS и Thrust.
Вы можете добиться дополнительного ускорения, используя шаблоны для CUDA ядер при разработке алгоритмов MATLAB. Шаблоны для CUDA ядер вы можете использовать в таких операций, как свертка, медианная фильтрация и методы конечных элементов. Сгенерированный код использует разделяемую память для улучшения пропускной способности памяти и локальности данных. Матрично-матричные операции могут использоваться в таких операций, как вычисление суммы абсолютных разностей (SAD), суммы квадратов разностей (SSD). В этом случае сгенерированный код переиспользует данные и улучшает пропускную способность памяти.
GPU Coder генерирует код из функций языка MATLAB, которые инженеры обычно используют для разработки алгоритмов в качестве компонентов для более крупных систем. GPU Coder поддерживает более 380 функций MATLAB и сопутствующих тулбоксов, в том числе указанные ниже.
Вы можете использовать директиву coder.ceval для включения внешнего CUDA кода в ваш сгенерированный код. Внешний код может быть уже существующим рукописным кодом для сред разработки, для которых вы генерируете и интегрируете код, или любой другой CUDA код, указанный пользователем, который используется в процесс сборки в GPU Coder. Сгенерированный код будет содержать вызовы внешних CUDA функций в соответствующих местах.
Также можно подключить внешний CUDA код в MATLAB для моделирования и проверки его поведения, написав функцию MATLAB, которая использует coder.ceval для вызова внешнего CUDA кода, а затем сгенерировать из функции MEX файл.
MEX-функция это скомпилированный С или CUDA код для выполнения внутри MATLAB, и может быть вызвана вместо кода MATLAB в следующих задачах:
В рамках тестирования рабочего процесса вы должны протестировать сгенерированный код и убедиться, что MEX-функция обеспечивает все ту же функциональную возможность, что и исходный код в MATLAB.
Тестирование алгоритма в виде MEX-функции перед генерацией кода, позволяет обнаруживать и исправлять ошибки, возникающие при выполнении кода, которые намного сложнее диагностировать в сгенерированном коде. Запуск MEX-функции в MATLAB позволяет выполнять проверки целостности памяти для C/C++ кода, выполняются проверки границ массивов, их размерности и размера стека, и если нарушение обнаруживаются, MATLAB останавливает выполнение и выдает диагностическое сообщение.
Вы можете скомпилировать сгенерированный код с помощью продуктов NVIDIA и запустить его на графических процессорах, таких как NVIDIA Tesla и NVIDIA Tegra. Для графических процессоров (видеокарт), установленных на хост-компьютере, где установлен MATLAB, вы можете скомпилировать его с помощью компилятора NVIDIA. Если сгенерированный код вызывает сторонние библиотеки, такие как cuDNN, cuFFT, cuSolver или cuBLAS, вам необходимо предварительно установить эти библиотеки перед началом компиляции сгенерированного кода.
На встраиваемых графических платформах вы можете вручную подключить сгенерированный код в проект и скомпилировать его на целевой платформе с помощью инструментов NVIDIA. Кроме того, с помощью пакета поддержки для встраиваемых графических процессоров NVIDIA вы можете использовать кросс-компиляцию и запускать сгенерированный CUDA код в виде отдельного приложения или библиотеки для встраиваемых GPU на таких платах, как NVIDIA Drive или NVIDIA Jetson. Пакет поддержки также позволяет удаленно взаимодействовать с платой NVIDIA, управлять периферийными устройствами на плате и быстро создавать на ее основе прототипы устройств.
Используя GPU Coder совместно с Embedded Coder, есть возможность дополнительно оптимизировать эффективность кода и настроить сгенерированный код. Используйте интерактивный отчет о генерации кода с трассируемостью кода для представления о том, как ваш MATLAB код транслируется в сгенерированный CUDA C код.
Embedded Coder также позволяет проверять поведение сгенерированного кода на его численную эквивалентность эталонной модели с помощью тестирования в режиме «Программа в контуре» (SIL) для проверки сгенерированного CUDA кода, предназначенного для запуска на встраиваемых GPU.