Назначение DSP-ядер для выполнения кернелов
В библиотеке ELcoreCL существует поддержка как статического, так и динамического назначения DSP-ядер для выполнения кернелов.
Выбор того или другого способа назначения DSP-ядер зависит от используемой функции постановки
ELcoreCL-кернела в очередь: eclEnqueueNDRangeKernel()
или
eclEnqueueSharedKernel()
.
Предупреждение
При использовании модели параллельного программирования spawn/sync и функции
постановки в очередь eclEnqueueKernelWithSpawn()
всегда используется статическое
назначение DSP-ядер.
На диаграмме ниже изображена схема назначения DSP-ядер для выполнения ELcoreCL-кернелов.
Детальное описание устройства очередей описано в разделе Локальная и глобальная очереди задач документации драйвера.
Сценарий использования статического назначения DSP-ядер
CPU-программа:
Выделяет ELcoreCL-устройства с помощью
eclGetDeviceIDs()
, на которых планируется выполнить ELcoreCL-кернелы.Создает контекст с помощью
eclCreateContext()
.Инициализирует ELF-файл с помощью
eclCreateProgramWithBinary()
.Создает ELcoreCL-кернел с помощью
eclCreateKernel()
.При необходимости подготавливает данные и передает аргументы в ELcoreCL-кернел с помощью функций семейства
eclSetKernelArg*()
.Ставит в очередь на выполнение ELcoreCL-кернел с помощью
eclEnqueueNDRangeKernel()
. В этом случае номера ELcoreCL-устройств, выделенных на п. 1, совпадают с физическими номерами DSP-ядер. Библиотека ELcoreCL ставит в локальную очередь драйвера elcore50 задание для DSP-ядра, номер которого совпадает с номером ELcoreCL-устройства.Ожидает завершения ELcoreCL-кернела с помощью
eclWaitForEvents()
.
Сценарий использования динамического назначения DSP-ядер
CPU-программа:
Выделяет ELcoreCL-устройства с помощью
eclGetDeviceIDs()
, на которых планируется выполнить ELcoreCL-кернелы.Создает контекст с помощью
eclCreateContext()
.Инициализирует ELF-файл с помощью
eclCreateProgramWithBinary()
.Создает ELcoreCL-кернел с помощью
eclCreateKernel()
.При необходимости подготавливает данные и передает аргументы в ELcoreCL-кернел с помощью функций семейства eclSetKernel*().
Ставит в очередь на выполнение ELcoreCL-кернел с помощью eclEnqueueSharedKernel(). В этом случае номера ELcoreCL-устройств, выделенных на п. 1, интерпретируются как виртуальные. Библиотека ELcoreCL ставит в глобальную очередь драйвера elcore50 задание. Назначение конкретного DSP-ядра для выполнения данного задания выполняется планировщиком DSP
Ожидает завершения ELcoreCL-кернела с помощью
eclWaitForEvents()
.