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 для этого и множество других методов.