RomanNew 0 10 января, 2014 Опубликовано 10 января, 2014 · Жалоба Добрый день/ночь! Прошу помощи форумчан. Хочу использовать микроконтроллер для произведения большого объема вычислений, но не уверен в том, достаточна ли его мощность. Марка микроконтроллера еще не выбрана, скорее всего, на ядре ARM или Cortex. Прошу счастливых владельцев микроконтроллеров на ядре ARM и/или AVR произвести замер времени выполнения простейшего вычисления с вещественными числами. Покупать отладочную плату и программатор для этого слишком накладно. Если производительности не хватит, буду вынужден использовать мощный РС под управлением ОС реального времени. Либо можно запараллелить несколько микроконтроллеров. Детали кода значения не имеют, нужно просто ПРИМЕРНО оценить длительность вычислений с применением умножения и деления вещественных чисел. Желательно использовать real двойной точности (64 бит), но это не принципиально. Заранее благодарен всем откликнувшимся! Пример кода на псевдоязыке //желательно использовать real двойной точности (64 бит), но это не принципиально real a = 1; real b = 1234.567; //получить текущее значение системного время в мсек или мксек int StartTime = getCurrentTime(); //рабочий цикл for (int i=0; i<1000000; i++) { a = a + (real(i) / b ); b = b + 0.000001; //на всякий пожарный If (a>100000000) {a=1}; } //итоговая длительность вычислений int Dur = getCurrentTime() - StartTime; //используем полученное значение, чтобы слишком умный компилятор не удалил неиспользуемые вычисления //вместо Print можно сделать что угодно, лишь бы использовать значение! //например, сохранить в EEPROM Print(a); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 10 января, 2014 Опубликовано 10 января, 2014 · Жалоба с максимальной оптимизацией по скорости получилось: для CM3:( IAR DLIB ) 250 572 180 тактов для float ( 32 бита ) 347 571 190 тактов для double ( 64 бита ) для AVR: ( IAR DLIB ) 1 725 881 000 тактов для float ( 32 бита ) 3 697 655 000 тактов для double ( 64 бита ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 10 января, 2014 Опубликовано 10 января, 2014 · Жалоба с максимальной оптимизацией по скорости получилось: для CM3:( IAR DLIB ) 250 572 180 тактов для float ( 32 бита ) * 72 MHz = 4 секунды примерно? Ы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 10 января, 2014 Опубликовано 10 января, 2014 · Жалоба * 72 MHz = 4 секунды примерно? Ы? сам офигел. Смотрю дизасм, и вызываются либовские aeabi_i2d, __aeabi_ddiv, __aeabi_dadd, __aeabi_cdrcmple Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanNew 0 10 января, 2014 Опубликовано 10 января, 2014 · Жалоба сам офигел. Смотрю дизасм, и вызываются либовские aeabi_i2d, __aeabi_ddiv, __aeabi_dadd, __aeabi_cdrcmple Спасибо! Уточню: такт - имеется в виду такт процессора? нет ли там какого-либо пересчета (кратности и т.д.). То есть, действительно ли получается 250 млн тактов процессора / 72мгц = примерно 3,5 сек? дальше, деление реализовано программно (через библиотеку)? апппаратное деление бывает? или только в DSP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 10 января, 2014 Опубликовано 10 января, 2014 (изменено) · Жалоба Уточню: такт - имеется в виду такт процессора? да. нет ли там какого-либо пересчета (кратности и т.д.). пока не наблюдаю То есть, действительно ли получается 250 млн тактов процессора / 72мгц = примерно 3,5 сек? вроде дальше, деление реализовано программно (через библиотеку)? да апппаратное деление бывает? бывает для целочисченных. Смотреть ссылку для плавучки ручками, с приведением мантис или только в DSP? там может и есть. Поспрашивайте кто юзает CM4 или BF или прочее Изменено 11 января, 2014 пользователем Herz Оформление цитат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 11 января, 2014 Опубликовано 11 января, 2014 (изменено) · Жалоба Может имеет смысл глянуть в сторону STM32F407 или иже с ним (M4F) с аппаратным FPU и 168МГц? Или обязательное условие double-вычисления? ЗЫ. Может не совсем в тему, но тестировал на АВР и АРМе сишную вирт. задачу, так производительность арма раз в 15 быстрее (целочисленная 16 и 32х битная арифметика) Тактовая авр 12МГц АРМ - 168.. Изменено 11 января, 2014 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба AVR 8 разрядов, ARM 32. Понятно что производительность AVR на такой арифметике будет на порядки медленнее. AVR хорош для обрадотки 8-ми битных данных. Тексты, всякие протоколы на основе ASCII через UART и другие 8-ми битные порты. Ногами подрыгать тоже не плохо получается. Если нужны 64-бит вычисления то на AVR и смотреть не стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 12 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба AVR 8 разрядов, ARM 32. Понятно что производительность AVR на такой арифметике будет на порядки медленнее. http://ru.wikipedia.org/wiki/AVR32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба с максимальной оптимизацией по скорости получилось: Можете сам исходный файл показать? Тогда можно будет на разных контроллерах проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба +1. кидайте законченный код, запущу на авр32 60 мгц но вообще за счет более высокой тактовой частоты должны выигрывать ARMы с FPU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба Можете сам исходный файл показать? Тогда можно будет на разных контроллерах проверить. дык автар дал же, ну вот void test(void) { #define TT double // #define TT float TT a = 1.0; TT b = 1234.567; for ( int i = 0; i < 1000000; i++ ) { a = a + (TT(i) / b ); b = b + 0.000001; if( a > 100000000 ) a = 1; } LPC_TIM0->TCR = (u32)a; // PORTA = ((int)a) & 0x0F; } проверял в симуляторах ( реальной железки не было под рукой ). для AVR делал max_i = 1000; для CM3 max_i = 100000; и умножал результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanNew 0 11 января, 2014 Опубликовано 11 января, 2014 · Жалоба спасибо всем откликнувшимся проверял в симуляторах ( реальной железки не было под рукой ). можно ли отталкиваться от этих цифр, которые дал симулятор? точность порядка +-50% меня вполне устраивает На что в первую очередь нужно обращать внимание для увеличения производительности ARM (кроме увеличения такт. частоты): наличие аппаратного FPU? Есть ли заметная (в несколько раз) разница в производительности между различными семействами - ARM9, ARM11, Cortex и т.д., или в принципе они равнозначны, и нужно только выбрать макс. так частоту и аппаратный FPU? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба для AVR: ( IAR DLIB ) 1 725 881 000 тактов для float ( 32 бита ) 3 697 655 000 тактов для double ( 64 бита ) В железе: ATMega128 16MHz, замеры времени по TIMER1 плюс прерывание по его переполнению для увеличения разрядности. float Time (10000) = 0x00000063 C069 0,4085825625 сек Time (100000) = 0x000003B3 6C89 3,8806485625 сек Time (1000000) = 0x0000230D 2135 36,7539393125 сек double Time (10000) = 0x00000942 3A67 9,7084544375 сек Time (100000) = 0x00005AF5 3CA3 95,3763301875 сек Time (1000000) = 0x0003887D 262C 948,42531475 сек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanNew 0 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба В железе: ATMega128 16MHz, замеры времени по TIMER1 плюс прерывание по его переполнению для увеличения разрядности. float Time (10000) = 0x00000063 C069 0,4085825625 сек Time (100000) = 0x000003B3 6C89 0,8806485625 сек Time (1000000) = 0x0000230D 2135 36,7539393125 сек double Time (10000) = 0x00000942 3A67 9,7084544375 сек Time (100000) = 0x00005AF5 3CA3 95,3763301875 сек Time (1000000) = 0x0003887D 262C 948,42531475 сек спасибо. цифры заставили задуматься, что что-то я не там ищу....Значит мощный x86, и никаких альтернатив Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться