SSE2: функция журнала двойной точности

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

__m128d _mm_log_pd(__m128d);

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

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


person watson1180    schedule 13.12.2010    source источник
comment
Когда вы запрашиваете открытый исходный код, вам обычно нужно указать лицензию для вашего проекта, чтобы люди знали, сможете ли вы использовать код под определенной лицензией или нет.   -  person Cascabel    schedule 13.12.2010
comment
Лицензия не имеет значения. Это для проекта в шланге. Для этого подходят все лицензии с открытым исходным кодом.   -  person watson1180    schedule 13.12.2010
comment
@Jefromi: И наоборот, ответы, скорее всего, будут полезны другим вопрошающим в будущем, если они не слишком узко сформулированы.   -  person caf    schedule 14.12.2010
comment
Что не так с использованием инструкций журнала FPU? Они как минимум с двойной точностью.   -  person PhiS    schedule 18.12.2010
comment
@PhiS: вы можете самостоятельно реализовать более быстрый, но менее точный журнал (или что-то еще). После профилирования иногда это правильно.   -  person Alexandre C.    schedule 27.12.2010
comment
Связано: версия AVX2 того же вопроса, с ответом, который многое объясняет о том, как реализовать свой собственный, и другим ответом, который имеет работающую реализацию.   -  person Peter Cordes    schedule 27.08.2017


Ответы (5)


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

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

person pic11    schedule 21.04.2011

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

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

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

person Alexandre C.    schedule 27.12.2010

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

person renick    schedule 27.12.2010

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

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

person Serge Rogatch    schedule 26.08.2017

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

person uesp    schedule 13.12.2010
comment
Я считаю, что полностью точная реализация требует арифметики с множественной точностью. - person caf; 14.12.2010
comment
Ряд Тейлора не является правильным способом сделать это. Следует использовать специальные аппроксимации рациональных функций. Мне нужно что-то почти такое же точное, как журнал cmath, но быстрее. В противном случае я мог бы просто отправить все в журнал cmath. Реализация ICC является точной и быстрой. Мне нужно что-то подобное, но с открытым исходным кодом. - person watson1180; 14.12.2010
comment
@ watson1180, по-видимому, аппроксимация рациональной функции медленнее, чем методы ряда Тейлора на современном оборудовании. - person David Heffernan; 28.12.2010