Jump to content
    

Умножение и деление в ядрах АРМ

Всем доброго дня!

 

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

То есть, как эффективней считать нормировку на ядре 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 не поможет)

 

Спасибо

Share this post


Link to post
Share on other sites

Умножение быстрее. Но на фоне sqrt() вряд ли заметите разницу.

Share this post


Link to post
Share on other sites

Умножение быстрее. Но на фоне sqrt() вряд ли заметите разницу.

 

 

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

 

А на сколько быстрее? Сам пока оценить не могу, нет ни компилятора, чтобы ассемблерный листинг посмотреть, ни само собой отладочной платы. Может кто-нибудь дать оценку?

Share this post


Link to post
Share on other sites

Попробуйте в симуляторе проверить или в железе. Должно быть примерно одинаково, но как правило деление медленнее.

Share this post


Link to post
Share on other sites

нет ни компилятора

Компилятор вместе со средой можно скачать бесплатно, для маленького кода можно использовать также бесплатно:

https://www.keil.com/download/product/

https://www.iar.com/iar-embedded-workbench/

 

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

 

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

Share this post


Link to post
Share on other sites

Компилятор вместе со средой можно скачать бесплатно, для маленького кода можно использовать также бесплатно:

https://www.keil.com/download/product/

https://www.iar.com/iar-embedded-workbench/

 

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

 

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

 

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

 

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

 

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

 

1_Qol_Pp1_Nc_AEt_Zr6e_OAJsr_OA.png

 

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

 

Спасибо

 

Можно попробовать использовать ядро Cortex-M7 с double precission FPU

Share this post


Link to post
Share on other sites

Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...

Share this post


Link to post
Share on other sites

Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...

Ну как откуда? Некий автор в очередной раз успешно измерил скорость работы GPIO :laughing:

Share this post


Link to post
Share on other sites

Ну как откуда? Некий автор в очередной раз успешно измерил скорость работы GPIO :laughing:

Надеюсь все-таки что измерения не верны... Не шибко верю что скорость аппаратных модулей FPU и DPFPU вообще различна (хотя раза в 2 я еще поверю, из-за двойного чтения слов для double вместо одного для float, но и то это мои догадки)... :crying:

Edited by Arlleex

Share this post


Link to post
Share on other sites

Надеюсь все-таки что измерения не верны...

То что там написано, вообще можно воспринимать как написанное на заборе. Обратите хотя-бы внимание на длительность сложения float и doublle. Не находите странным что float получилось медленнее? :biggrin:

При этом никакие попытки измерить скорость GPIO (и учесть её влияние) не произведены. Не произведены также попытки учесть влияние кешей и пр.

В мусорку такие "результаты".

Share this post


Link to post
Share on other sites

Интересно откуда такая разница в вычислениях корня float и double с аппаратным double-precision FPU...

Вангую кривую библиотеку. Аффтар даже не пишет, чем собирает. У того же GNU Arm Embedded иногда бывают чудеса в библиотеке (newlib).

Share this post


Link to post
Share on other sites

Неделю назад выложили (arm.com) очередную версию arm-none-eabi-gcc с поправленной библиотекой в части тормозовы вычисления функций с одинарной точностью на процессорах без DP FPU.

◦Fixed powf/expf/exp2f/logf/log2f performance regression
Edited by Genadi Zawidowski

Share this post


Link to post
Share on other sites

Неделю назад выложили (arm.com) очередную версию arm-none-eabi-gcc с поправленной библиотекой в части тормозовы вычисления функций с одинарной точностью на процессорах без DP FPU.

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

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

 

И ещё.

Вычисление квадратного корня на arm чипе с аппаратной поддержкой 14тиков для одинарной точности, и кажется 36тиков для двойной(не уверен в точности). Это аппаратные инструкции для Cortex-M4-7, которых естественно нету в Cortex-Axx - потому как это отдельная ветка развития ядра, и у них вроде как война.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...