Логарифм с SSE или переключение на FPU?

Я делаю некоторые статистические расчеты. Мне нужно, чтобы они были быстрыми, поэтому я переписал большинство из них, чтобы использовать SSE. Я довольно новичок в этом, поэтому мне было интересно, какой правильный подход здесь:

Насколько мне известно, в SSE нет функции log2 или ln, по крайней мере, не до 4.1, что является последней версией, поддерживаемой оборудованием, которое я использую.

Это лучше:

  1. Извлеките 4 числа с плавающей запятой и выполните для них вычисления с помощью FPU, чтобы определить энтропию - мне не нужно загружать любое из этих значений обратно в регистры SSE, просто сложите их в другое число
  2. найти функцию для SSE, которая делает log2

2 ответа

Решение

Кажется, есть несколько SSE log2 реализации вокруг, например, этот.

Существует также библиотека Intel Approximate Maths, которая имеет log2 Функция среди других - это старая (2000), но это SSE2, и она все еще должна работать достаточно хорошо.


Смотрите также:

Нет инструкции SSE, которая реализует функцию логарифма. Тем не менее, также нет единственной инструкции x86, которая выполняет общий логарифм. Если вы думаете об использовании функции логарифма, как log или же log10 из стандартной библиотеки C стоит взглянуть на реализацию, которая используется в библиотеке с открытым исходным кодом, такой как libc. Вы можете легко свернуть свое собственное логарифмическое приближение, которое действует для всех элементов в регистре SSE.

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

log_y(x) = log_a(x) / log_a(y)

куда a является основой подпрограммы логарифма, которую вы создали.

Другие вопросы по тегам