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

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

|
а не сокращает, я его после цикла распечатываю =) наибольший эффект дает ключ -ffast -math, без него при минимальной оптимизации float = 1,992 сек быстродействие победил =). b принималось за константу заменил на Код b = b + 0.001; итоговый результат без оптимизации float = 3,256 сек после оптимизации float = 2,64 сек результаты вычислений в обоих случаев одинаковы, т.е. ничего в цикле не сокращается
|
|
|
|
|
Jan 14 2014, 07:57
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-01-14
Пользователь №: 79 981

|
всем спасибо тема закрыта вижу, что на микроконтроллере такие задачи не решить
|
|
|
|
|
Jan 14 2014, 08:21
|

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

|
Цитата(RomaRoma @ Jan 14 2014, 11:57)  вижу, что на микроконтроллере такие задачи не решить теоретически, вам нужен microcontroller with double-precision FPU это только в ARM9. к примеру у NXP значится LPC3180 This CPU coprocessor provides full support for single-precision and double-precisionили искать другие контроллеры с ядром VFP9-S
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Jan 14 2014, 10:06
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
С вашего позволения, предлагаю тест, который 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 недоработано.
|
|
|
|
|
Jan 14 2014, 13:21
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(RomaRoma @ Jan 14 2014, 11:57)  всем спасибо тема закрыта вижу, что на микроконтроллере такие задачи не решить на всякий случай - есть микроконтроллеры с поддержкой double FPU например LPC3xxx (ARM9+FPU) также у renesas-а есть SH-2|3|4 семейство с 64бит FPU у них и по целым числам получше чем у ARM-ов - может есть и не BGA корпуса если BGA не смущает, то imx то есть, микроконтроллеры бывают разные, можно к ПК (типа на атоме Ж  по скорости вычислений приблизиться Цитата(ViKo @ Jan 14 2014, 14:06)  Последняя цифра меня удивила. Видимо, использование FPU STM32 для double в Keil недоработано.  ну я сам лудить/паять, в тонкую математику не лезу, но наши математики, когда им предлагаю взять замечательный проц без FPU или с 32х битным FPU (что для даблов одноикственно) сразу же с негодованием отвергают и приблизительно такими же соотношениями мотивируют
|
|
|
|
|
Jan 14 2014, 16:23
|

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

|
Цитата(ViKo @ Jan 14 2014, 05:06)  С вашего позволения, предлагаю тест, который 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 недоработано.  для сравнения: 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
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|