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

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

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

 

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

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

 

Спасибо

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


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

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

 

 

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

 

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

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


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

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

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


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

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

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

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

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

 

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

 

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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

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

Изменено пользователем Arlleex

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


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

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

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

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

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

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


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

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

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

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


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

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

◦Fixed powf/expf/exp2f/logf/log2f performance regression
Изменено пользователем Genadi Zawidowski

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


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

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

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

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

 

И ещё.

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

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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