Введение
Средства разработки программного обеспечения ELcore-50 включают в себя:
компилятор, компоновщик, ассемблер и другие инструменты для сборки исполняемого файла, пригодного для выполнения на DSP;
библиотеку ElcoreCL, реализующую API похожее на OpenCL, которая позволяет запускать задания на DSP, а также обмениваться данными между пользовательским процессом и заданием;
вспомогательную статическую библиотеку elcore-runtime для DSP, содержащую код, необходимый для запуска заданий, работы с DMA и кэшем DSP.
драйвер elcore50, реализующий запуск заданий и управление памятью.
Примерный сценарий разработки ПО для ELcore-50:
Код, который планируется выполнять на DSP, пишется на ассемблере или другом поддерживаемом инструментами языке.
Код из п.1 собирается в виде статически скомпонованного исполняемого файла. Как правило это
*.so
-библиотека. Функции, которые планируется вызывать, должны быть объявлены глобальными.Исполняемые файлы из п.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-х битный режим). Соглашение о вызовах».