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

в 10:09, , рубрики: мультиклет, Программинг микроконтроллеров, Процессоры, Электроника для начинающих, метки:

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

Сразу стоит заметить, что я рассматриваю только разработку на 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Мгц обычного не-суперскалярного процессора) из-за неоптимизированного кода. Вся надежда на то, что разработчики компилятора за этот год его допилят, и Мультиклет сможет как-то конкурировать с другими отечественными разработками.

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

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

Проголосовало 11 человек. Воздержалось 4 человека.

Автор: BarsMonster

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js