Быстрые тригонометрические функции, использующие только целое число в c ++ для целевой цели

Я пишу код для ARM-Target, который использует множество операций с плавающей запятой и тригонометрических функций. AFAIK вычисления с плавающей точкой НАМНОГО медленнее, чем int (особенно на ARM). Точность не имеет решающего значения.

Я думал о реализации моих собственных тригонометрических функций с использованием коэффициента масштабирования (т. Е. Диапазон от 0 * pi до 2 * pi становится int от 0 до 1024) и таблиц поиска. Это хороший подход?
Есть ли альтернативы?

Целевая платформа — это Odroid U2 (Exynos4412) под управлением Ubuntu и множества других вещей (веб-сервер и т. Д.).

(c ++ 11 и boost / библиотеки разрешены)

1

Решение

Exynos 4412 использует ядро ​​Cortex-A9 [1], которое имеет полностью конвейеризованную плавающую точку одинарной и двойной точности. Нет смысла прибегать к целочисленным операциям, как это было с некоторыми более старыми ядрами ARM.

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

[1] http://en.wikipedia.org/wiki/Exynos_(system_on_chip)

1

Другие решения

Если у вашей целевой платформы есть математическая библиотека, используйте ее. Если это хорошо, это было написано экспертами, которые рассматривали скорость. Вы не должны основывать дизайн кода на догадках о том, что быстро или медленно. Если у вас нет фактических измерений или характеристик процессора, и вы не знаете, что тригонометрические функции в вашем приложении отнимают много времени, то у вас нет веских оснований для замены математических библиотек.

Инструкции с плавающей точкой обычно имеют более длительные задержки, чем целочисленные инструкции, но они конвейерны, так что пропускная способность может быть сопоставимой. (Например, модуль с плавающей запятой может иметь четыре этапа для выполнения работы, поэтому для выполнения всех этапов инструкции требуется четыре цикла, но вы можете вставить новую инструкцию на первом этапе в каждом цикле.) Достаточно, чтобы обеспечить производительность наравне с целочисленной реализацией, в значительной степени зависит от целевого процессора, используемого алгоритма и навыков разработчика.

Если в вашем случае полезно использовать пользовательские реализации математических подпрограмм, то то, как они должны быть разработаны, в значительной степени зависит от обстоятельств. Правильный совет зависит от области поддержки (от 0 до 2π? –2π до + 2π? Возможно, большие значения, которые нужно сложить до -π до π?), Какие особые случаи необходимо поддерживать (распространять NaN?), требуемая точность, что еще происходит в процессоре (много памяти используется или мы можем положиться на таблицу поиска, оставшуюся в кеше?), и многое другое.

Значительная часть тригонометрических процедур обрабатывает различные случаи (NaN, бесконечности, малые значения) и сокращает аргументы по модулю 2π. Может быть возможным реализовать урезанные подпрограммы, которые не обрабатывают особые случаи или не выполняют редукцию аргументов, но по-прежнему используют плавающую точку.

5

Одна из возможных альтернатив — trigint:

  1. Trigint скачать
  2. Trigint Doxygen
1

Вы должны использовать математику с фиксированной точкой, а не с плавающей точкой.

Большинство процессоров ARM (7 и выше) допускают 32-битное разрешение в фиксированной точке. Таким образом, вы можете легко перейти к 1E-3 радианам. Но настоящий вопрос какая точность вам нужна в результатах?

Использовать ли таблицы подстановки, таблицы подстановки с интерполяцией или функции, зависит от того, сколько пространства данных у вас в вашей системе. Таблицы поиска выполняются быстрее всего, но используют больше всего пространства данных. Функции используют наименьшее количество данных, но требуют наибольшего времени выполнения. Интерполяция может быть помехой, которая допускает меньшие таблицы и некоторую дополнительную обработку.

0
По вопросам рекламы [email protected]