Мультиклет: практические использование и производительность

от автора

В мои руки попала отладочная плата мультиклета, и результатами его тестирования хочу поделится. Также расскажу и о нескольких подводных камнях, которые могут несколько подпортить нервы тем, кто захочет лично потрогать Мультиклет.

Сразу стоит заметить, что я рассматриваю только разработку на C т.к. нынче время работы программистов стоит дороже мегагерцев и памяти. У С-компилятора Мультиклета тяжелая судьба, и на _данный момент_ он находится в зачаточном состоянии (в частности, не реализованы какие-либо оптимизации). Ситуация обещает исправиться к середине/концу года.

Железо


Это отладочный комплект НW1-MCp04 (более старый и дорогой). Процессор тут работает на частоте 80Мгц. Разведены интерфейсы RS232, установлены контроллеры USB(1.1, Full-Speed, 12Mbit) и LAN (10/100 MBit). Какой-либо программной поддержки USB и LAN на данный момент нет.

«IDE»

IDE Мультиклета представляет собой PSPad с забиндеными горячими кнопками для компиляции и загрузки бинарника в отладочную плату. Само собой, такая IDE мне показалась бесполезной. К счастью, собирать проект и заливать файлы в плату можно и скриптами:

Компиляция:

MultiClet\SDK\shell\MultiClet\build_project.cmd <директория с исходниками>

Из коробки скрипт компиляции не работал — т.к. внутри не был указан путь к платформо-зависимым инклудам, добавить его можно и самому:

rem Ключи запуска препроцессора компилятора Си set CPP_KEYS=%CPP_KEYS% -Wp-I.. -Wp-I"%INCDIR%" -Wp-I"[..ваш путь..]\MultiClet\Projects\inc\c"

Видимо с этой проблемой сталкивались и создатели примеров на C, т.к. в некоторых из них или скопировано содержимое нужных инклудов, или скопированы сами подключаемые из SDK файлы.

Заливка прошивки в плату:

MultiClet\SDK\bin\mc-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!!\r\n", 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Мгц обычного не-суперскалярного процессора) из-за неоптимизированного кода. Вся надежда на то, что разработчики компилятора за этот год его допилят, и Мультиклет сможет конкурировать с другими отечественными разработками.

Стоит ли организовать публичный доступ к отладочной плате мультиклета?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Никто ещё не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи http://habrahabr.ru/post/165043/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *