Перейти к содержанию
    

Помогите оттестировать производительность микроконтроллера ARM или AVR

В железе: ATMega128 16MHz, замеры времени по TIMER1 плюс прерывание по его переполнению для увеличения разрядности.

float Time (1000000) = 0x0000230D 2135 36,7539393125 сек

double Time (1000000) = 0x0003887D 262C 948,42531475 сек

 

чойта странно, при double получилось 15 174 805 036 тактов, при float - 588 063 029 тактов. Смущает кратность в 26 раз.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чойта странно, при double получилось 15 174 805 036 тактов, при float - 588 063 029 тактов. Смущает кратность в 26 раз.

Все вопросы к компилятору:

asm_float.txt

 

asm_double.txt

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ужесточил типы, теперь между double и float разница 8-9-и кратная!

 

float

Time (10000) = 00000107 BA45 1,0802283125 сек

Time (100000) = 00000A49 CDB9 10,7880595625 сек

Time (1000000) = 0000661C 332D 107,0702588125 сек

 

double

Time (10000) = 000007AD AF87 8,0514484375 сек

Time (100000) = 00005F37 60E0 99,84155 сек

Time (1000000) = 0003B3B0 8E95 993,7246493125 сек

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ужесточил типы, теперь между 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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PIC32, 80 MHz (оптимизация средненькая, такую дает бесплатный вариант лицензии MPLAB-C32 компилятора )

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 секунд

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чой та я в шоке. Что вообще за компилятор ?

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

	  #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);
  }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

avr32 60MHz i = 1 000 000

без оптимизации

double 7,544 сек

float 3,177 сек

на макс оптимизации

double 6,904 сек

float 208 мсек

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

avr32 60MHz i = 1 000 000

без оптимизации

double 7,544 сек

float 3,177 сек

на макс оптимизации

double 6,904 сек

float 208 мсек

 

208 миллисекунд?

Примерно 12 циклов на операцию?

Чегото слишком оптимистично..

12 миллионов циклов супротив майкрочиповских 500 миллионов?

 

Не верится..

Это в симуляторе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на реальной плате

 

причем double не особо круто соптимизировало.

a ассемблерный код есть посмотреть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

думаю гдето дурит, слишком сильно ускоряет вычисление даже при включение минимальной оптимизации

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, если посмотреть в float числа:

 

1234.567 = 0x449A 5225

1234.567001 = 0x449A 5225

и только

1234.5671 = 0x449A 5226

 

и компилятор наверное об этом знает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на реальной плате

причем double не особо круто соптимизировало.

Такое ощущение, что там Ваш никнейм приключился :) И оно "соптимизировало" переменные, так как они больше нигде не используются. или цикл "соптимизировало".

Попробуйте их объявить как volatile, ну или посмотрите что там в a и в b после выполнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...