Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Умножение и деление в ядрах АРМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AlexeyT
Всем доброго дня!

Есть вопрос: какие операции с плавающей точкой выполняются быстрее - умножение или деление?
То есть, как эффективней считать нормировку на ядре Arm:

double a;
double b, c, d;//значения присваиваются в ходе выполнения программы

a = sqrt(b*b + c*c + d*d);

b /= a;
c /= a;
d /= a;

Или:
double a;
double b, c, d;//значения присваиваются в ходе выполнения программы

a = 1./sqrt(b*b + c*c + d*d);

b *= a;
c *= a;
d *= a;

Ядрa: Cortex-M1 и Cortex-M4F (что не особо важно, т.к. расчеты должны быть в формате double и плавающая запятая в Cortex-M4F не поможет)

Спасибо
aaarrr
Умножение быстрее. Но на фоне sqrt() вряд ли заметите разницу.
AlexeyT
Цитата(aaarrr @ Jul 1 2018, 23:37) *
Умножение быстрее. Но на фоне sqrt() вряд ли заметите разницу.



Ну у Уоррена есть примеры сверхбыстрого вычисления sqrt для float.

А на сколько быстрее? Сам пока оценить не могу, нет ни компилятора, чтобы ассемблерный листинг посмотреть, ни само собой отладочной платы. Может кто-нибудь дать оценку?
aaarrr
Цитата(AlexeyT @ Jul 2 2018, 00:48) *
А на сколько быстрее?

В разы быстрее.
Den64
Попробуйте в симуляторе проверить или в железе. Должно быть примерно одинаково, но как правило деление медленнее.
Forger
Цитата(AlexeyT @ Jul 2 2018, 00:48) *
нет ни компилятора

Компилятор вместе со средой можно скачать бесплатно, для маленького кода можно использовать также бесплатно:
https://www.keil.com/download/product/
https://www.iar.com/iar-embedded-workbench/

Есть и другие среды, целиком бесплатные (на базе компилятора GCC).

Внутри любой нормальной среды есть симулятор, тогда отладочная плата для данной ситуации не обязательна.
BioWolf2000
Цитата(Forger @ Jul 2 2018, 08:21) *
Компилятор вместе со средой можно скачать бесплатно, для маленького кода можно использовать также бесплатно:
https://www.keil.com/download/product/
https://www.iar.com/iar-embedded-workbench/

Есть и другие среды, целиком бесплатные (на базе компилятора GCC).

Внутри любой нормальной среды есть симулятор, тогда отладочная плата для данной ситуации не обязательна.


С осциллографом измерения уже делали )

https://blog.classycode.com/esp32-floating-...ce-6e9f6f567a69

В микросекундах



Цитата(AlexeyT @ Jul 1 2018, 23:21) *
Ядрa: Cortex-M1 и Cortex-M4F (что не особо важно, т.к. расчеты должны быть в формате double и плавающая запятая в Cortex-M4F не поможет)

Спасибо


Можно попробовать использовать ядро Cortex-M7 с double precission FPU
Arlleex
Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...
jcxz
Цитата(Arlleex @ Jul 5 2018, 13:48) *
Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...

Ну как откуда? Некий автор в очередной раз успешно измерил скорость работы GPIO laughing.gif
Arlleex
Цитата(jcxz @ Jul 5 2018, 15:11) *
Ну как откуда? Некий автор в очередной раз успешно измерил скорость работы GPIO laughing.gif

Надеюсь все-таки что измерения не верны... Не шибко верю что скорость аппаратных модулей FPU и DPFPU вообще различна (хотя раза в 2 я еще поверю, из-за двойного чтения слов для double вместо одного для float, но и то это мои догадки)... crying.gif
jcxz
Цитата(Arlleex @ Jul 5 2018, 14:16) *
Надеюсь все-таки что измерения не верны...

То что там написано, вообще можно воспринимать как написанное на заборе. Обратите хотя-бы внимание на длительность сложения float и doublle. Не находите странным что float получилось медленнее? biggrin.gif
При этом никакие попытки измерить скорость GPIO (и учесть её влияние) не произведены. Не произведены также попытки учесть влияние кешей и пр.
В мусорку такие "результаты".
scifi
Цитата(Arlleex @ Jul 5 2018, 13:48) *
Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...

Вангую кривую библиотеку. Аффтар даже не пишет, чем собирает. У того же GNU Arm Embedded иногда бывают чудеса в библиотеке (newlib).
Arlleex
В общем в очередной раз "не железо виновато..."(с) rolleyes.gif
Genadi Zawidowski
Неделю назад выложили (arm.com) очередную версию arm-none-eabi-gcc с поправленной библиотекой в части тормозовы вычисления функций с одинарной точностью на процессорах без DP FPU.
Цитата
◦Fixed powf/expf/exp2f/logf/log2f performance regression
AVI-crak
Цитата(Genadi Zawidowski @ Jul 5 2018, 18:21) *
Неделю назад выложили (arm.com) очередную версию arm-none-eabi-gcc с поправленной библиотекой в части тормозовы вычисления функций с одинарной точностью на процессорах без DP FPU.

Какое странное совпадение, неделю назад я выловил последний баг в собственной библиотеке стандартных математических функций для одинарной точности. Но у меня была задача сделать минимальную ошибку вычислений. Значит зря старался?
Кстати - дай плиз ссылку для особоленивых... А то у них там обе ноги сломать можно, пока найдёшь то что нужно.

И ещё.
Вычисление квадратного корня на arm чипе с аппаратной поддержкой 14тиков для одинарной точности, и кажется 36тиков для двойной(не уверен в точности). Это аппаратные инструкции для Cortex-M4-7, которых естественно нету в Cortex-Axx - потому как это отдельная ветка развития ядра, и у них вроде как война.
Genadi Zawidowski
https://developer.arm.com/open-source/gnu-t...nu-rm/downloads

У A9 есть корень квадратный... или о каком "А" речь?

на SP sqrtf, на DP sqrt
AVI-crak
Цитата(Genadi Zawidowski @ Jul 6 2018, 01:02) *
У A9 есть корень квадратный... или о каком "А" речь?

Поддержка со стороны gcc остановилась на V8, без дальнейшего развития. Аппаратная поддержка может быть и есть, а вот программной - нету. Для применения приходится запускать отдельную функцию, gcc не выполняет мета подстановку автоматически.

А спрашивал я о встроенных в gcc библиотеках, тех-что откомпелированны.
Ну да, есть у gcc собственный гит, и я даже знаю его адрес. Но то-ли руки кривые, то-ли там кривизна превышает мой уровень, но скачать репозиторий у меня не получается. А бродить по бесконечным каталогам через веб интерфейс - унылое занятие.
Как вариант- гит устаревшей библиотеки, той что была в каталоге gcc.
https://github.com/devkitPro/newlib/tree/master/newlib
Genadi Zawidowski
выбор аппаратного или программного в моем bare metal применении - клбчами при компиляции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.