Язык эффективного программирования
векторного узла процессоров семейства NeuroMatrix®, приближенный к математической нотации
А.А. Бирюков, ЗАО НТЦ «Модуль», ведущий инженер-программист,
Архитектура NeuroMatrix® - оригинальная разработка ЗАО НТЦ «Модуль», применяемая в цифровой обработке сигналов[1].
В докладе описывается реализация языка высокого уровня для программирования эффективной обработки матричных операций на векторном узле процессоров данного семейства.
Постановка задачи
Процессорное ядро NeuroMatrix® делится на универсальную скалярную часть, отвечающую за управление и инфраструктуру, и специализированную векторную, на которую в задачах обработки сигналов ложится основная вычислительная нагрузка. Высокоуровневое программирование скалярного кода обеспечивает компилятор С/С++[1], векторное же ядро ранее программировалось на ассемблере, а конечный пользователь писал программу с использованием библиотеки векторно -матричных операций на языке С/С++.
Такое положение вещей имеет недостатки. Во-первых, пользователь ограничен функциями библиотеки, либо вынужден изучать программирование матричного узла на ассемблере. Во-вторых, при выпуске новых устройств как функции библиотеки, так и пользовательский код может оказаться неработоспособным или неоптимальным.
Описанные проблемы потребовали повышения уровня языка программирования. В связи с этим было решено разработать высокоуровневое средство эффективного программирования вычислительных задач на матричном устройстве NeuroMatrix.
Один из подходов - разработка языка специального, отражающего особенности целевого устройства. В качестве примера успешной реализации его следует упомянуть технологию CUDA фирмы NVidia[3].
Другим подходом является разработка кодогенератора для универсального языка программирования, создающего код, задействующий векторный узел. Выгоды очевидны, но имеются следующие недостатки применения универсального ЯП.
Во-первых, сложность создания эффективного кодогенератора. Во-вторых, универсальный язык скрывает от пользователя «рельсы», при сходе с которых порождение эффективного кода просто невозможно. В-третьих, не все возможности архитектуры могут быть изящно выражены на универсальном языке.
В виду таких особенностей рассматриваемой архитектуры как гибкость и своеобразие, была выбрана разработка специального языка.
О языке nmvcpl
В качестве средства решающего поставленную задачу предлагается язык nmvcpl, NeuroMatrix vector core programming language. Синтаксис языка максимально приближен к математической записи операций над матрицами. В то же время, практически любая конструкция на целевом языке ассемблера может быть выражена средствами языка.
В первую очередь, компилятор языка берет на себя максимум рутинной работы, связанной с особенностями конфигурирования матричного устройства. Вместо работы со специальными регистрами пользователь теперь задает абстрактный тип обрабатываемых данных, при этом компилятор выполняет проверки корректности программы, такие как согласованность перемножаемых матриц.
Центральный узел процессора NeuroMatrix, блок вычисления взвешенного суммирования (фактически, перемножения матриц), имеет физически ограниченные размеры, откуда проистекает естественное требование на размеры множителей: сумма размеров полей строки матрицы в битах должна равнятся шестидесяти четырем. Одна из основных функций языка - предоставление пользоваетелю виртуально неограниченного устройства для умножения матриц. Это в частности позволяет легко менять размерности задачи и точность вычислений, что делает язык удобным средством экспериментирования.
Кроме того, язык содержит встроенное средство описания массивов констант, вычисляемых по формуле, описанной как выражение на языке С/С++ на этапе компиляции.
Планы по развитию
В близком будущем планируется добавить в язык новые функции. К примеру, матричное устройство позволяет производить разбиение 64-х битного слова на поля различного размера, планируется поддержать это и в языке. Также весьма востребована функция задания динамического размера матрицы. В ассемблере таких инструкций нет, но определенные приемы позволяют сделать эмуляцию. Ранее это описывалось макросами, но язык позволит скрыть эту механику от пользователя.
Также будет полезным реализовать PC-кодогенератор для целей тестирования
Пример программы
В качестве примера приведем переупаковку (изменение размера полей) массива. В тексте программы можно видеть следующие конструкции: описания целочисленных констант, описания потоков данных, операцию умножения матриц и специальные конструкции.
// Пример: переупаковка массива часел.
.nmvcpl_begin
.offsets by rows // Считать смещения в строках
const int totalSize = 256; const int bitsIN = 4; на входе
const int bitsOUT = 8; на выходе
const int columns = 64/bitsIN; матричной формы
const int rows = totalSize/rowSize;
//
// //
Размер массива
Размер поля
//
Размер поля Размерности
// Единичная матрица
int:bitsOUT [r:columns][columns]
ID
.constants " int:bitsIN Вход
int:bitsOUT [r:rows][columns] C Выход
C=A * ID; //
r==_i_ ? 1 : 0 ";
[r:rows][columns] A = addr a + r;
addr_c + r; Вычисление
// //
.nmvcpl_end
Было бы сложно написать (и тем более, автоматически оттранслировать) эту программу используя универсальный ЯП, поскольку 4-битные целые встроенным типом обычно не являются.
Результаты
В качестве средства высокоуровневого средства разработки эффективных программ для векторного ядра №ишМайх создан язык nmvcpl и компилятор для него. На языке реализовано несколько прикладных функций, в том числе КИХ-фильтр и быстрое преобразование Фурье на 256 точек. Оттранслированные программы запускались на плате мц5101, содержащей процессор архитектуры №ишМайх 1879ВМ4 (NN6405), и продемонстрировали скорость выполнения, близкую к скорости функции, написанной на ассемблере вручную, при сохранении точности результатов.
Язык все еще находится в состоянии развития, но семантика и синтаксис основных конструкций уже в целом устоялись, что позволило начать решение прикладных задач с его использованием. Доведение языка и средств разработки до промышленной применимости планируется закончить 2011 году.
Табл. 1. Скорость БПФ-256 в сравнении с библиотечной функцией
Реализация Процессор Тактов про-
цессора
Библиотечная функция на ассемблере nm6403 3662[2]
Код, полученный из nmvcpl-программы nm6405 3880
Литература
1. В. Черников, П. Виксне, А. Шелухин, П. Шевченко, А. Панфилов, А. Бирюков, А. Рузавин. Семейство процессоров NeuroMatrix® - архитектура, кросс-средства разработки программ, перспективы развития, Сборник трудов второй международной научно-практической конференции "Современные информационные технологии и ИТ-образование" под ред. проф. В.А.Сухомлина, Москва, 2006
2. В. Кашкаров, С. Мушкаев. Организация параллельных вычислений в алгоритмах БПФ на процессоре NM6403. - , журнал "Цифровая обработка сигналов", No1, 2001
3. NVidia CUDA Reference Manual (англ.), доступен для загрузки на http://developer.nvidia.com/object/cuda_3_2_toolkit_rc.html