Назначение DSP-ядер для выполнения кернелов

В библиотеке ELcoreCL существует поддержка как статического, так и динамического назначения DSP-ядер для выполнения кернелов.

Выбор того или другого способа назначения DSP-ядер зависит от используемой функции постановки ELcoreCL-кернела в очередь: eclEnqueueNDRangeKernel() или eclEnqueueSharedKernel().

Предупреждение

При использовании модели параллельного программирования spawn/sync и функции постановки в очередь eclEnqueueKernelWithSpawn() всегда используется статическое назначение DSP-ядер.

На диаграмме ниже изображена схема назначения DSP-ядер для выполнения ELcoreCL-кернелов.

Детальное описание устройства очередей описано в разделе Локальная и глобальная очереди задач документации драйвера.

../_images/elcorecl-queues.svg

Назначение DSP-ядер для выполнения ELcoreCL-кернелов.

Сценарий использования статического назначения DSP-ядер

CPU-программа:

  1. Выделяет ELcoreCL-устройства с помощью eclGetDeviceIDs(), на которых планируется выполнить ELcoreCL-кернелы.

  2. Создает контекст с помощью eclCreateContext().

  3. Инициализирует ELF-файл с помощью eclCreateProgramWithBinary().

  4. Создает ELcoreCL-кернел с помощью eclCreateKernel().

  5. При необходимости подготавливает данные и передает аргументы в ELcoreCL-кернел с помощью функций семейства eclSetKernelArg*().

  6. Ставит в очередь на выполнение ELcoreCL-кернел с помощью eclEnqueueNDRangeKernel(). В этом случае номера ELcoreCL-устройств, выделенных на п. 1, совпадают с физическими номерами DSP-ядер. Библиотека ELcoreCL ставит в локальную очередь драйвера elcore50 задание для DSP-ядра, номер которого совпадает с номером ELcoreCL-устройства.

  7. Ожидает завершения ELcoreCL-кернела с помощью eclWaitForEvents().

Сценарий использования динамического назначения DSP-ядер

CPU-программа:

  1. Выделяет ELcoreCL-устройства с помощью eclGetDeviceIDs(), на которых планируется выполнить ELcoreCL-кернелы.

  2. Создает контекст с помощью eclCreateContext().

  3. Инициализирует ELF-файл с помощью eclCreateProgramWithBinary().

  4. Создает ELcoreCL-кернел с помощью eclCreateKernel().

  5. При необходимости подготавливает данные и передает аргументы в ELcoreCL-кернел с помощью функций семейства eclSetKernel*().

  6. Ставит в очередь на выполнение ELcoreCL-кернел с помощью eclEnqueueSharedKernel(). В этом случае номера ELcoreCL-устройств, выделенных на п. 1, интерпретируются как виртуальные. Библиотека ELcoreCL ставит в глобальную очередь драйвера elcore50 задание. Назначение конкретного DSP-ядра для выполнения данного задания выполняется планировщиком DSP

  7. Ожидает завершения ELcoreCL-кернела с помощью eclWaitForEvents().