|
|
  |
Помогите оттестировать производительность микроконтроллера ARM или AVR |
|
|
|
Jan 12 2014, 19:12
|

Частый гость
 
Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376

|
Цитата(megajohn @ Jan 12 2014, 21:15)  чойта странно, при double получилось 15 174 805 036 тактов, при float - 588 063 029 тактов. Смущает кратность в 26 раз. Все вопросы к компилятору:
asm_float.txt ( 6.58 килобайт )
Кол-во скачиваний: 179
asm_double.txt ( 7.89 килобайт )
Кол-во скачиваний: 213
|
|
|
|
|
Jan 12 2014, 20:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(M_Andrey @ Jan 12 2014, 23:58)  Ужесточил типы, теперь между double и float разница 8-9-и кратная! float Time (1000000) = 0000661C 332D 107,0702588125 сек double Time (1000000) = 0003B3B0 8E95 993,7246493125 сек Чой та я в шоке. Что вообще за компилятор ? теперь у вас увеличилось время для float почти в три раза, но стало близко к моему с 1% ошибкой ( 1 713 124 141 vs 1 725 881 000 ) но double долго считается по отношению к коду сгенеренному в IAR.
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Jan 12 2014, 22:49
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
PIC32, 80 MHz (оптимизация средненькая, такую дает бесплатный вариант лицензии MPLAB-C32 компилятора ) CODE typedef long double f64; typedef unsigned int u32; volatile f64 a = 1; volatile f64 b = 1234.567;
int main(void) { u32 i; //рабочий цикл for (i=0; i<1e6; i++) { a = a + ((f64)i / b ); b = b + 0.000001; //на всякий пожарный if (a>100000000) a = 1; } return 0; } 510024595 машинных циклов 6.375307 секунд Если 32-битные вычисления Код typedef float f64; 415782614 мц 5.197283 секунд
|
|
|
|
|
Jan 13 2014, 08:52
|

Частый гость
 
Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376

|
Цитата(megajohn @ Jan 12 2014, 23:05)  Чой та я в шоке. Что вообще за компилятор ? IAR C/C++ Compiler for AVR 5.50.0 (5.50.0.50277)C:\Program Files\IAR EW 5.5\avr\bin\iccavr.exe 14.04.2010 16:14:06, 11579392 bytes Full DLIB - \avr\LIB\DLIB\dlAVR-3s-ec_mul-64-f.r90 CODE #define cycle 1000000L #define TT double //#define TT float TT test(void) { TT a = (TT)1.0; TT b = (TT)1234.567; for (long i = 0; i < cycle; i++) { a = a + ( (TT)i / b ); b = b + (TT)0.000001; if (a > (TT)100000000.0) a = (TT)1.0; } return(a); }
|
|
|
|
|
Jan 13 2014, 13:37
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(ZASADA @ Jan 13 2014, 06:02)  avr32 60MHz i = 1 000 000 без оптимизации double 7,544 сек float 3,177 сек на макс оптимизации double 6,904 сек float 208 мсек 208 миллисекунд? Примерно 12 циклов на операцию? Чегото слишком оптимистично.. 12 миллионов циклов супротив майкрочиповских 500 миллионов? Не верится.. Это в симуляторе?
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 13 2014, 14:39
|

Знающий
   
Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210

|
Цитата 800036E0 mov R8, 0 800036E2 movhi R7, 0x3f80 800036E6 sub R8, -1 800036E8 cp.w R8, 1000000 800036EC breq 0x8000370e 800036EE cop CP0, CR9, CR0, CR8, 12 800036F2 cop CP0, CR7, CR9, CR5, 14 800036F6 cop CP0, CR0, CR7, CR6, 24 800036FA brvs 0x80003702 800036FE brle 0x800036e6 80003702 movhi R7, 0x3f80 80003706 sub R8, -1 думаю гдето дурит, слишком сильно ускоряет вычисление даже при включение минимальной оптимизации
|
|
|
|
|
Jan 13 2014, 14:41
|

Частый гость
 
Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376

|
Кстати, если посмотреть в float числа: 1234.567 = 0x449A 5225 1234.567001 = 0x449A 5225 и только 1234.5671 = 0x449A 5226 и компилятор наверное об этом знает
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|