В мои руки попала отладочная плата мультиклета, и результатами его тестирования хочу поделится. Также расскажу и о нескольких подводных камнях, которые могут несколько подпортить нервы тем, кто захочет лично потрогать Мультиклет.
Сразу стоит заметить, что я рассматриваю только разработку на C т.к. нынче время работы программистов стоит дороже мегагерцев и памяти. У С-компилятора Мультиклета тяжелая судьба, и на _данный момент_ он находится в зачаточном состоянии (в частности, не реализованы какие-либо оптимизации). Ситуация обещает исправиться к середине/концу года.
Железо
Это отладочный комплект НW1-MCp04 (более старый и дорогой). Процессор тут работает на частоте 80Мгц. Разведены интерфейсы RS232, установлены контроллеры USB(1.1, Full-Speed, 12Mbit) и LAN (10/100 MBit). Какой-либо программной поддержки USB и LAN на данный момент нет.
«IDE»
IDE Мультиклета представляет собой PSPad с забиндеными горячими кнопками для компиляции и загрузки бинарника в отладочную плату. Само собой, такая IDE мне показалась бесполезной. К счастью, собирать проект и заливать файлы в плату можно и скриптами:
Компиляция:
MultiCletSDKshellMultiCletbuild_project.cmd <директория с исходниками>
Из коробки скрипт компиляции не работал — т.к. внутри не был указан путь к платформо-зависимым инклудам, добавить его можно и самому:
rem Ключи запуска препроцессора компилятора Си
set CPP_KEYS=%CPP_KEYS% -Wp-I.. -Wp-I"%INCDIR%" -Wp-I"[..ваш путь..]MultiCletProjectsincc"
Видимо с этой проблемой сталкивались и создатели примеров на C, т.к. в некоторых из них или скопировано содержимое нужных инклудов, или скопированы сами подключаемые из SDK файлы.
Заливка прошивки в плату:
MultiCletSDKbinmc-ploader <файл с собранным бинарником>
Загружать нужно при зажатой кнопке reset на плате.
Чтобы работала заливка прошивки — нужно установить драйверы для PicoTap. К сожалению, сами драйверы PicoTap не подписаны (!?!), соответственно загрузить их затруднительно. Если отключить в Windows проверку подписи драйверов — то оказывается Windows (8 x64) блокирует их загрузку из-за известной несовместимости.
Решение — руками выбрать для PicoTap драйвер FTDI, и проигнорировать предупреждение Windows что ей не кажеться что этот драйвер подойдет. Это заставляет надеяться что создание самодельного адаптора на FTDI-чипе вполне возможно.
Внутрисхемной отладки нет.
Пишем Hello World
Выводить сообщения будем через RS232. При соединении с компьютером в стандартном кабеле папа-мама нужно поменять местами пины RX и TX (2 и 3). Берем стандартный пример uart, перенастраиваем его на скорость работы 115200 бод:
void uart_init(UART_TypeDef *UART)
{
int port, bitrate, control;
port = 0x00000300; //alternative port function for uart0
bitrate = 0x56;//115200 bps
control = 0x00000003; //rx, tx enable
GPIOB->BPS = port;
UART->BDR = bitrate;
UART->CR = control;
}
Значение Bitrate вычисляется по формуле 80Мгц/115200/8 = 86 (0x56) или 87.
Дописываем функцию вывода строки и вывода символа с проверкой на переполнение буфера UART:
void uart_send_with_delay(char byte, UART_TypeDef *UART)
{
while(uart_fifo_full(UART0) == 1);
uart_send_byte(byte, UART);
}
void uart_puts(char *msg, UART_TypeDef *UART)
{
while(*msg)uart_send_with_delay(*msg++, UART);
}
и наконец:
void main()
{
uart_init(UART0); //config uart0
uart_puts("Hello world from Multiclet!!rn", UART0);
}
Подключаемся к COM-порту любым удобным терминалом и получаем ожидаемый результат.
Практическая производительность
Возьмем простейшую программу для теста:
float i,j,result;
for(i=0;i<1;i+=0.0002)
for(j=0;j<1;j+=0.0002)
{
result+=i*j;
}
Тело внутреннего цикла выполняется 25 млн раз. На Мультиклете с частотой 80Мгц этот код работает 20.3 секунды с текущим компилятором.
Если мы немного поможем компилятору, и руками развернем цикл:
for(i=0;i<1;i+=0.0002)//8 seconds
for(j=0;j<1;j+=0.0008)
{
result+=i*j+i*(j+0.0002)+i*(j+0.0004)+i*(j+0.0006);
}
То тест будет работать уже 8 секунд, если упростить выражение до result+=i*(j*4+0.0012), то 6.8 секунды.
На мой взгляд, с текущим неоптимизирующим компилятором производительность получается на уровне абстрактного одноядерного процессора с частотой 5-10Мгц. Безусловно, производительность будет существенно улучшена по мере развития компилятора.
Теоретическая производительность
Наконец, стало ясно, какая теоретически-достижимая производительность у Мультиклета при идеальном распараллеливании на частоте 100Мгц:
2.4 GFLOP: Если все 4 клетки выполняют только операцию комплексного умножения, и больше ничего.
800 MFLOP: Если все 4 клетки выполняют остальные арифметические операции в упакованном виде (т.е. одна и та же операция выполняется над обоими 32-х битными половинками).
400 MFLOP — Если у нас операции нужно делать только по одному разу, а не парами (как обычно это бывает на не-вычислительном коде).
Наконец, если у нас распарралеливание на 4 клетки не получится — то рассчитывать можно будет только на 150-300MFLOP.
Потребление энергии
При максимальной нагрузке:
1.8V — 0.39A
3.3V — 7.2mA
Соответственно, потребляемая мощность — 0,725Вт на частоте 80Мгц (на 100Мгц будет выше).
Режима сна в документации я не нашел (хотя нога выхода из спящего состояния есть). При зажатом reset-е потребление падает до 0.3А по шине 1.8V, и 0.8ма по шине 3.3V.
Резюме
С текущим состоянием C-компилятора производительность фатально низкая (соответствующая 5-10Мгц обычного не-суперскалярного процессора) из-за неоптимизированного кода. Вся надежда на то, что разработчики компилятора за этот год его допилят, и Мультиклет сможет как-то конкурировать с другими отечественными разработками.
Автор: BarsMonster