Введение

Средства разработки программного обеспечения ELcore-50 включают в себя:

  • компилятор, компоновщик, ассемблер и другие инструменты для сборки исполняемого файла, пригодного для выполнения на DSP;

  • библиотеку ElcoreCL, реализующую API похожее на OpenCL, которая позволяет запускать задания на DSP, а также обмениваться данными между пользовательским процессом и заданием;

  • вспомогательную статическую библиотеку elcore-runtime для DSP, содержащую код, необходимый для запуска заданий, работы с DMA и кэшем DSP.

  • драйвер elcore50, реализующий запуск заданий и управление памятью.

Примерный сценарий разработки ПО для ELcore-50:

  1. Код, который планируется выполнять на DSP, пишется на ассемблере или другом поддерживаемом инструментами языке.

  2. Код из п.1 собирается в виде статически скомпонованного исполняемого файла. Как правило это *.so-библиотека. Функции, которые планируется вызывать, должны быть объявлены глобальными.

  3. Исполняемые файлы из п.2 загружаются при помощи библиотеки ElcoreCL и глобальные функции, экспортируемые библиотекой, видны пользователю как ядра ElcoreCL (кернелы).

Библиотека ELcoreCL поддерживает следующие сценарии запуска кернелов на DSP:

  • локальная очередь (стандартный сценарий): выполнение кернела будет осуществляться на DSP-ядре, номер которого совпадает с номером ELcoreCL-устройства. Другими словами, программист сам решает на каком из DSP-ядер будет выполняться кернел, а назначение конкретного DSP-ядра для выполнения кернела осуществляется статически (подробнее см. Назначение DSP-ядер для выполнения кернелов).

  • глобальная очередь: выполнение кернела будет осуществляться на первом освободившемся DSP-ядре. Номер ELcoreCL-устройства считается виртуальным, т.е. не соответствует конкретному физическому номеру DSP-ядра. Назначение конкретного DSP-ядра осуществляется динамически планировщиком заданий в драйвере elcore50 (подробнее см. Назначение DSP-ядер для выполнения кернелов).

  • spawn/sync: для выполнения кернела назначается несколько ELcoreCL-устройств с целью распараллеливания вычислений. Номера ELcoreCL-устройств соответствуют физическим номерам DSP-ядер, связанным с ними. При этом, один из DSP является основным и выполняют основную программу. Остальные ядра — вспомогательные и подключаются к вычислениям при вызове основным ядром специальных функций (подробнее см. Модель параллельного программирования spawn/sync).

На рисунке ниже приведен пример временной диаграммы использования различных сценариев при запуске кернелов на DSP, при условии наличия в системе 16 DSP. Обозначение DSPs 0c,1,2,3 означает, что кернел запускается в режиме spawn/sync, причем DSP0 является основным, а DSP1, DSP2 и DSP3 — вспомогательными.

Все экспортируемые функции из библиотеки с кодом для ELcore-50 должны следовать документу «Компилятор С/С++ Clang для DSP Elcore50 (32-х битный режим). Соглашение о вызовах».

digraph G {

  node [ shape = box, style = filled ]

  {rank = same; elcoreruntime; elcorecl}

  kernel [label = "DSP asm/C/C++\nsource"]
  toolchain [label = "DSP\nclang/ld/asm"]
  elcoreruntime [label = "elcore-runtime\nlibrary"]
  application [label = "CPU\napplication"]
  elcorecl [label = "ElcoreCL\nlibrary"]
  elcore [label = "elcore\nlibrary"]
  driver [label = "elcore50 driver"]
  qlic [label = "qlic driver"]

  kernel -> toolchain [style = dotted]
  toolchain -> elcoreruntime [style = dotted]
  elcoreruntime -> elcore [style = dotted]
  application -> elcorecl
  elcorecl -> elcore
  elcorecl -> driver
  elcore -> driver

  subgraph cluster_0 {
    label = "kernel space"
    labeljust=r
    style = dotted
    driver -> qlic
    driver -> clkapi
  }
}

Диаграмма вызовов