Управление вычислительным
кластером DSP процессоров на
Erlang
Илья Щербак
Eltex
ilya@shcherbak.ru
I. Intro
С чего все начиналось?
Особенности специализированных
вычислителей
•
•
•
•
•

Различные архитектуры (DSP, GPU, FPGA, ARM, etc)
Сложность разработки
Сложность отладки
Низкий уровень
Высокие требования к разработчику
– Как этого избежать?
– Как этого избежать?
– Никак.
– Зачем это нужно?
– Зачем это нужно?
– Решение специализированных
задач более эффективно.
Когда это нужно
•
•
•

Нужно повысить вычислительную плотность
Нужно сэкономить на энергопотреблении
GPP не справляется с этой задачей или решение на GPP
слишком дорого
Что хорошо делать на DSP
•
•
•

Цифровая обработка сигналов
Анализ изображений
Обработка видео
Чего стоит избегать

•
•

Бизнес логика на вычислителях
Монолитность системы
Модульная архитектура
•
•
•

DSP выполняет узкоспециализированную задачу
DSP могут быть скоммутированы произвольным образом
Бизнес-логика системы находится на уровне хоста
DSP – специализированный
вычислитель
The UNIX K.I.S.S.
Простые части через прозрачный интерфейс
II. Actor model and Erlang
Особенности модели
акторов
•
•
•

Интефейс обмена сообщениями
Динамическое порождение других акторов
Изоляция данных внутри актора, отсутствие shared state
Модель акторов хорошо
подходит для concurency систем
Erlang как реализация модели
акторов
Особенности Erlang VM
•
•
•
•

Очень дешевые процессы
Легкие байнари
Развитые extentions механизмы
Сборщик мусора на каждый Erlang процесс
(никакого Stop-World)
Erlang process как интерфейс к
вычислителю
III. Cluster structure
Вычислительная часть
TI TMS320C6678
Core Pack
•
•
•
•

8 ядер 1025 MGz
8 функциональных модулей на ядро
VLIW (Very long instruction world) архитектура
L1/L2 configurable cache
On-Chip Memory
•
•
•
•

256 KB L1 Program Memory/Cache
256 KB L1 Data Memory/Cache
4096 KB L2 Memory/Cache
4096 KB MSM
Peripherals
•
•
•
•
•
•
•
•
•
•
•

EMIF
EDMA3
SRIO
PCIe
Ethernet
HyperLink
TSIP
SPI
UART
I2C
GPIO
Figure 1-1

Functional Block Diagram

Memory Subsystem
4MB
MSM
SRAM

64-Bit
DDR3 EMIF

MSMC

Debug & Trace

Boot ROM

Semaphore

C66x
CorePac

Power
Management
PLL

32KB L1
P-Cache

´3

32KB L1
D-Cache

512KB L2 Cache

EDMA

8 Cores @ up to 1.25 GHz

´3

TeraNet

HyperLink

Multicore Navigator

Switch

´4
SRIO

Ethernet
Switch
SGMII
´2

´2
TSIP

SPI

UART

´2
PCIe

I2C

GPIO

EMIF 16

Queue
Manager

Packet
DMA

Security
Accelerator
Packet
Accelerator

Network Coprocessor
Peripherals use in cluster
•
•
•

EMIF
EDMA3
PCIe
DSP programm
SYS/BIOS
•
•
•
•
•

Real-time OS
Управление памятью
Механизмы шедулинга
Механизмы синхронизации
Инструменты мониторинга и отладки
Транспортная часть
PCI-E/DMA/MSI
PCIe
Peripheral Component Interconnect

•
•

Соединение точка-точка
Транзакционный протокол
DMA
Direct Memory Access

•

Транспорт данных через EDMA для снижения нагрузки на
хост/DSP
MSI
Message Signalled Interrupt

•
•

Отсутствие гонок
Расширенный набор векторов прерывания
IV. Driver interface
Функции драйвера

•
•

Загрузка DSP
Предоставление интерфейса к DSP
Boot
protocol
Process
protocol
Implemented interfaces

•
•

read/write – для синхронных операций
mmap/ioctl/poll – для асинхронных запросов
V. Erlang interface
Взаимодействие с кодом
vs
взаимодействие с приложением
Скорость
vs
Безопасность VM
Erlang extentions
•
•
•
•

Port extentions
Port Driver
Erlang DP
NIF (Native Implemented Function)
Почему NIF – самый быстрый
extention механизм
•
•
•
•

Прямой вызов функции, как BIF
Исполнение в контексте Erlang process
Использование внутренних структур данных VM
Прямой доступ к Heap процесса
NIF only
Erlang VM
driver_lib.so

DSP

Host

DSP

DSP

DSP

Cluster
Гибридная схема

•
•

NIF – как интерфейс доступа к Shared Memory
Port extention – как интерфейс доступа к вычислителю
Гибридная схема
shm_lib.so
shm_lib.so
Erlang VM

OS Process

Host

DSP

DSP

DSP

DSP

Cluster
Zero-copy mode или
Magic binary
Erlang binary resource
Кастомные аллокаторы в Erlang
#define SIZE 100
ErlNifResourceType *resource;
static ERL_NIF_TERM sample_nif_function(ErlNifEnv *env,
int argc,
const ERL_NIF_TERM argv[]){
void *data = enif_alloc_resource(resource, SIZE);
return enif_make_resource(env, data);
}
static void custom_destructor(ErlNifEnv *env, void *obj){}
static int load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info){
resource = enif_open_resource_type(env, NULL, "resource",
custom_destructor,
ERL_NIF_RT_CREATE, NULL);
return 0;
}
Потоки данных в системе
Erlang VM

– реальный
поток
– логический
поток
Process
Producer

– Erlang Port

Process
Consumer
Erlang VM как тонкий коммутатор
App

App

App

Erlang VM

OS

Peripherials
Host

DSP cluster
VI. Shared memory framework
Задачи SHM framework
•
•
•

Аллокация shared memory
Серилизация/десерилизация
Получение объекта по id
Shared memory allocation
Buddy memory allocation
Lock free memory access
CAS operators
VII. Coda
Основные идеи доклада
•
•

Управляющая логика на Erlang

•
•

Система на Erlang нужным образом коммутирует DSP

Программа на DSP небольшая, хорошо выполняет
определенную задачу

При данной декомпозиции системы вычислитель легко
заменяется, так как логика работает с ним как с черным ящиком
Спасибо за внимание!
Илья Щербак
Eltex
ilya@shcherbak.ru

Илья Щербак, Eltex