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

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

Попробовал на Stm32f407 с использованием аппаратной плавающей точки, получилось 28000000 тактов процессора на 1000000 (миллион) итераций цикла - 28 тактов на итерацию.

Для double нет аппаратной поддержки и результат куда печальнее 1117999516 тактов, ~1118 тактов на итерацию.

Компилятор arm-none-eabi-gcc 4.7.3.

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


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

а не сокращает, я его после цикла распечатываю =)

наибольший эффект дает ключ -ffast -math, без него при минимальной оптимизации float = 1,992 сек

 

быстродействие победил =).

b принималось за константу

заменил на

 b = b + 0.001;

 

итоговый результат

без оптимизации float = 3,256 сек

после оптимизации float = 2,64 сек

 

результаты вычислений в обоих случаев одинаковы, т.е. ничего в цикле не сокращается

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


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

всем спасибо

тема закрыта

вижу, что на микроконтроллере такие задачи не решить

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


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

вижу, что на микроконтроллере такие задачи не решить

 

теоретически, вам нужен microcontroller with double-precision FPU

 

это только в ARM9.

к примеру у NXP значится LPC3180 This CPU coprocessor provides full support for single-precision and double-precision

 

или искать другие контроллеры с ядром VFP9-S

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


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

Попробовал на Stm32f407 с использованием аппаратной плавающей точки, получилось 28000000 тактов процессора на 1000000 (миллион) итераций цикла - 28 тактов на итерацию.

Мне кажется, вы ошиблись в 10 раз. Сам пробовал, в симуляторе.

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


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

С вашего позволения, предлагаю тест, который 1000 раз вычисляет число Пи (по формуле каких-то трех мудрецов). Тогда можно будет удостовериться, что программа работает правильно.

  typedef float tt;
  // typedef double tt;
  volatile tt pi;
  for (int n = 1000; n--; ) {
    pi = 4.0 / 1 - 2.0 / 4 - 1.0 / 5 - 1.0 / 6;
    for (int i = 1; i < 8; i++) {
      tt i8 = i * 8;
      tt p = 4 / (i8 + 1) - 2 / (i8 + 4) - 1 / (i8 + 5) - 1 / (i8 + 6);
      for (int j = i; j > 0; j--) {
        p /= 16;
      }
      pi += p;
    }
  }
  return pi;

float pi = 3.14159274 (ошибка связана с недостаточной точностью float формата при расчетах)

double pi = 3.141592653589

 

Keil, STM32, -O3 -Otime, симулятор, тактов на один цикл:

STM32F207: float = 4506, double = 8125

STM32F407, no use FPU: float = 4506, double = 8125

STM32F407, use FPU: float = 662, double = 10094

 

Последняя цифра меня удивила. Видимо, использование FPU STM32 для double в Keil недоработано. :rolleyes:

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


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

всем спасибо

тема закрыта

вижу, что на микроконтроллере такие задачи не решить

 

на всякий случай - есть микроконтроллеры с поддержкой double FPU

 

например LPC3xxx (ARM9+FPU)

 

также у renesas-а есть SH-2|3|4 семейство с 64бит FPU у них и по целым числам получше чем у ARM-ов - может есть и не BGA корпуса

 

если BGA не смущает, то imx

 

то есть, микроконтроллеры бывают разные, можно к ПК (типа на атоме Ж:) по скорости вычислений приблизиться

 

Последняя цифра меня удивила. Видимо, использование FPU STM32 для double в Keil недоработано. :rolleyes:

 

ну я сам лудить/паять, в тонкую математику не лезу, но наши математики, когда им предлагаю взять замечательный проц без FPU или с 32х битным FPU (что для даблов одноикственно) сразу же с негодованием отвергают и приблизительно такими же соотношениями мотивируют :)

 

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


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

Добавлю к списку еще MCU на Cortex-R4F, такие тоже есть, например TMS570 и RM4 (например RM48L930), они тоже имеют в составе дабл плавучку (VFPv3), еще ренесас - SuperH ядро, там тоже она есть.

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


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

С вашего позволения, предлагаю тест, который 1000 раз вычисляет число Пи (по формуле каких-то трех мудрецов). Тогда можно будет удостовериться, что программа работает правильно.

  typedef float tt;
  // typedef double tt;
  volatile tt pi;
  for (int n = 1000; n--; ) {
    pi = 4.0 / 1 - 2.0 / 4 - 1.0 / 5 - 1.0 / 6;
    for (int i = 1; i < 8; i++) {
      tt i8 = i * 8;
      tt p = 4 / (i8 + 1) - 2 / (i8 + 4) - 1 / (i8 + 5) - 1 / (i8 + 6);
      for (int j = i; j > 0; j--) {
        p /= 16;
      }
      pi += p;
    }
  }
  return pi;

float pi = 3.14159274 (ошибка связана с недостаточной точностью float формата при расчетах)

double pi = 3.141592653589

 

Keil, STM32, -O3 -Otime, симулятор, тактов на один цикл:

STM32F207: float = 4506, double = 8125

STM32F407, no use FPU: float = 4506, double = 8125

STM32F407, use FPU: float = 662, double = 10094

 

Последняя цифра меня удивила. Видимо, использование FPU STM32 для double в Keil недоработано. :rolleyes:

 

для сравнения:

 

Mac OS X 10.9.1 i7-2.2 GHz:

gcc -O3

10,000,000 cycles

 

float -

real 0m1.322s

user 0m1.316s

sys 0m0.004s

 

double -

real 0m2.073s

user 0m2.067s

sys 0m0.004s

 

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


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

итак вычисление числа Пи, код ViKo

AVR32, 60MHz, живое железо

float

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

cycles= 6 738 017 time=112.3 мсек pi=3.141592741013

с безопасной оптимизацией

cycles= 2 936 003 time=48.90 мсек pi=3.141592741013

оптимизация с ускоренным вычислением float

cycles= 442 001 time=7.37 мсек pi=3.141327857971 - кривое значение в мелких разрядах, зато быстро =)

 

double

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

cycles= 16 482 018 time=274.7 мсек pi=3.141592653589

с безопасной оптимизацией

cycles= 11 361 996 time=189.4 мсек pi=3.141592653589

оптимизация с ускоренным вычислением float

cycles= 11 813 997 time=196.9 мсек pi=3.141592653589 - даже чуть медленнее чем с обычными библиотеками float, но точность не пострадала

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


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

итак вычисление числа Пи

 

Ну дак к чему пришли? Может у кого есть желание сбацать сводную табличку, в процентном выражении от типа проца? ;)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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