SSE2: функция двойной точности записи
Мне нужен open source (без ограничения лицензии) реализация функции журнала, что-то с подписью
__m128d _mm_log_pd(__m128d);
Он доступен в библиотеке Intel Short Vector Math Library (часть ICC), но ICC не является ни бесплатным, ни открытым исходным кодом. Я ищу реализацию, используя только встроенные функции.
Он должен использовать специальные приближения рациональной функции. Мне нужно что-то почти такое же точное, как cmath log, скажем, 9-10 десятичных цифр, но быстрее.
Ответы
Ответ 1
Взгляните на AMD LibM. Это не открытый источник, а бесплатный. AFAIK, он работает на процессорах Intel. На той же веб-странице вы найдете ссылку на ACML, еще одну бесплатную математическую версию из AMD. В нем есть все, от AMD LibM + Matrix algos, FF и дистрибутивов.
Я не знаю реализации с открытым исходным кодом векторизованных математических функций с двойной точностью. Я полагаю, что процессоры Intel и AMD оптимизированы производителем процессора, и каждый использует их, когда скорость важна. IIRC, была предпринята попытка реализовать встроенные средства для векторизованных математических функций в GCC. Я не знаю, как далеко они успели добраться. Очевидно, что это не тривиальная задача.
Ответ 2
Я считаю, что log2
легче вычислить. Вы можете умножить/разделить число на две (очень быстрые), чтобы они лежали в (0.5, 2], а затем вы использовали аппроксимация Паде (возьмите M близко к N), который легко получить раз и навсегда, и чей заказ вы можете выбрать в соответствии с вашими потребностями. Вам нужны только арифметические операции, которые вы можете выполнить с помощью встроенных SSE. Не забудьте добавить/удалить константу в соответствии с приведенным выше коэффициентом масштабирования.
Если вы хотите естественный журнал, разделите на log2(e)
, который вы можете вычислить раз и навсегда.
Не редко можно увидеть пользовательские функции журнала в некоторых конкретных проектах. Стандартные функции библиотеки относятся к общему случаю, но вам нужно что-то более конкретное. Я искренне думаю, что это не так сложно сделать самому.
Ответ 3
Проект Framewave является лицензированным Apache 2.0 и имеет целью быть эквивалентом открытого кода Intel IPP. У этого есть реализации, которые близки к тому, что вы ищете.
Проверьте арифметические функции с фиксированной точностью в документации.
Ответ 4
Здесь приведен пример __m256d
: fooobar.com/questions/24095/.... Это должно быть довольно тривиально, чтобы разрезать его на __m128d
. Сообщите мне, если у вас возникнут проблемы с этим.
Или вы можете просмотреть мою реализацию как нечто, получающее сразу два номера __m128d
.
Ответ 5
Если вы не можете найти существующую реализацию с открытым исходным кодом, относительно легко создать свой собственный, используя стандартный метод серии Тейлора. См. Wikipedia для этого и множество других методов.