SSE2: функция регистрации двойной точности - PullRequest
10 голосов
/ 13 декабря 2010

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

__m128d _mm_log_pd(__m128d);

Он доступен в Intel Short Vector Math Library (часть ICC), но ICC не является ни бесплатным, ни открытым исходным кодом. Я ищу реализацию, использующую только встроенные функции.

Следует использовать специальные рациональные приближения функций. Мне нужно что-то почти такое же точное, как лог cmath, скажем, 9-10 десятичных цифр, но быстрее.

Ответы [ 5 ]

6 голосов
/ 27 декабря 2010

Я считаю, log2 легче вычислить. Вы можете умножить / разделить свое число на степень два (очень быстро), чтобы оно лежало в (0,5, 2], а затем использовать аппроксимацию Паде (возьмите M близко к N), что легко чтобы получить раз и навсегда, и чей порядок вы можете выбрать в соответствии с вашими потребностями. Вам нужны только арифметические операции, которые вы можете делать с внутренними SSE. Не забудьте добавить / удалить константу в соответствии с вышеуказанным коэффициентом масштабирования.

Если вам нужен натуральный логарифм, разделите на log2(e), чтобы вы могли вычислить его раз и навсегда.

Нередко можно увидеть пользовательские функции журнала в некоторых конкретных проектах. Стандартные библиотечные функции предназначены для общего случая, но вам нужно нечто более конкретное. Я искренне думаю, что это не так сложно сделать самостоятельно.

5 голосов
/ 22 апреля 2011

Взгляните на AMD LibM .Это не с открытым исходным кодом, но бесплатно.AFAIK, он работает на процессорах Intel.На этой же веб-странице вы найдете ссылку на ACML, еще одну бесплатную математическую библиотеку от AMD.В нем есть все, от AMD LibM + Matrix algos, FF и дистрибутивов.

Я не знаю ни одной открытой реализации векторизованных математических функций двойной точности.Я думаю, что процессоры Intel и AMD оптимизированы вручную производителем процессора, и каждый использует их, когда важна скорость.IIRC, была попытка реализовать встроенные функции для векторизованных математических функций в GCC.Я не знаю, как далеко им удалось пройти.Очевидно, это не тривиальная задача.

1 голос
/ 26 августа 2017

Вот аналог для __m256d: https://stackoverflow.com/a/45898937/1915854.Это должно быть довольно тривиально, чтобы сократить его до __m128d.Сообщите мне, если у вас возникнут какие-либо проблемы с этим.

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

1 голос
/ 27 декабря 2010

Framewave project имеет лицензию Apache 2.0 и стремится стать эквивалентом Intel IPP с открытым исходным кодом. Он имеет реализации, близкие к тому, что вы ищете. Проверьте арифметические функции с фиксированной точностью в документации.

0 голосов
/ 14 декабря 2010

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

...