neiver 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба Попробовал на Stm32f407 с использованием аппаратной плавающей точки, получилось 28000000 тактов процессора на 1000000 (миллион) итераций цикла - 28 тактов на итерацию. Для double нет аппаратной поддержки и результат куда печальнее 1117999516 тактов, ~1118 тактов на итерацию. Компилятор arm-none-eabi-gcc 4.7.3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба а не сокращает, я его после цикла распечатываю =) наибольший эффект дает ключ -ffast -math, без него при минимальной оптимизации float = 1,992 сек быстродействие победил =). b принималось за константу заменил на b = b + 0.001; итоговый результат без оптимизации float = 3,256 сек после оптимизации float = 2,64 сек результаты вычислений в обоих случаев одинаковы, т.е. ничего в цикле не сокращается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanNew 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба всем спасибо тема закрыта вижу, что на микроконтроллере такие задачи не решить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба вижу, что на микроконтроллере такие задачи не решить теоретически, вам нужен microcontroller with double-precision FPU это только в ARM9. к примеру у NXP значится LPC3180 This CPU coprocessor provides full support for single-precision and double-precision или искать другие контроллеры с ядром VFP9-S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба Попробовал на Stm32f407 с использованием аппаратной плавающей точки, получилось 28000000 тактов процессора на 1000000 (миллион) итераций цикла - 28 тактов на итерацию. Мне кажется, вы ошиблись в 10 раз. Сам пробовал, в симуляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба С вашего позволения, предлагаю тест, который 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба всем спасибо тема закрыта вижу, что на микроконтроллере такие задачи не решить на всякий случай - есть микроконтроллеры с поддержкой double FPU например LPC3xxx (ARM9+FPU) также у renesas-а есть SH-2|3|4 семейство с 64бит FPU у них и по целым числам получше чем у ARM-ов - может есть и не BGA корпуса если BGA не смущает, то imx то есть, микроконтроллеры бывают разные, можно к ПК (типа на атоме Ж:) по скорости вычислений приблизиться Последняя цифра меня удивила. Видимо, использование FPU STM32 для double в Keil недоработано. :rolleyes: ну я сам лудить/паять, в тонкую математику не лезу, но наши математики, когда им предлагаю взять замечательный проц без FPU или с 32х битным FPU (что для даблов одноикственно) сразу же с негодованием отвергают и приблизительно такими же соотношениями мотивируют :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба Добавлю к списку еще MCU на Cortex-R4F, такие тоже есть, например TMS570 и RM4 (например RM48L930), они тоже имеют в составе дабл плавучку (VFPv3), еще ренесас - SuperH ядро, там тоже она есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба С вашего позволения, предлагаю тест, который 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба могу завтра на авр32 запустить=) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба могу завтра на авр32 запустить=) ждемс.. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба итак вычисление числа Пи, код 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, но точность не пострадала Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба итак вычисление числа Пи Ну дак к чему пришли? Может у кого есть желание сбацать сводную табличку, в процентном выражении от типа проца? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться