Ускоренное графическим процессором вычисление следует за неоднородной моделью программирования. Очень parallelizable фрагменты программного обеспечения сопоставлены в ядра, которые выполняются на физически отдельном устройстве графического процессора, в то время как остаток от последовательного кода все еще работает на центральном процессоре. Каждое ядро выделяется несколько рабочих или потоков, которые организованы в блоках и сетках. Каждый поток в ядре выполняется одновременно с уважением друг к другу.
Цель GPU Coder™ состоит в том, чтобы взять последовательную программу MATLAB® и сгенерировать разделенный, оптимизированный код CUDA® от него. Этот процесс включает:
Разделение CPU/GPU — Идентификация сегментов кода, которые работают на центральном процессоре и сегментах, которые работают на графическом процессоре. Для различных путей GPU Coder идентифицирует ядра CUDA, смотрите Создание Ядра. Затраты на передачу памяти между центральным процессором и графическим процессором являются значительным фактором в алгоритме создания ядра.
После того, как разделение ядра завершено, GPU Coder анализирует зависимость по данным между разделами центрального процессора и графического процессора. Данные, которые совместно используются центральным процессором и графическим процессором, выделяются на памяти графического процессора (при помощи cudaMalloc
или API cudaMallocManaged
). Анализ также определяет минимальный набор местоположений, где данные должны быть скопированы между центральным процессором и графическим процессором при помощи cudaMemcpy
. Если использование Объединенная Память в CUDA, то та же аналитическая передача также определяет минимальные местоположения в коде, где вызовы cudaDeviceSync
должны быть вставлены, чтобы получить правильное функциональное поведение.
Затем, в каждом ядре, GPU Coder может принять решение сопоставить данные с общей памятью или постоянной памятью. Если используется мудро, эта память является частью структуры иерархии памяти графического процессора и может потенциально привести к большей пропускной способности памяти. Для получения информации о том, как GPU Coder принимает решение сопоставить с общей памятью, видеть, что Шаблон Обрабатывает. Для получения информации о том, как GPU Coder принимает решение сопоставить с постоянной памятью, видеть coder.gpu.constantMemory
.
Если разделение и выделение памяти и операторы передачи существуют, GPU Coder генерирует код CUDA, который следует за решениями разделения и выделения памяти. Сгенерированный исходный код может быть скомпилирован в цель MEX, которая будет названа из MATLAB или в разделяемую библиотеку, которая будет интегрирована с внешним проектом. Для опций GPU Coder смотрите GPU Coder Configuration Properties.