Логарифм с SSE или переключение на FPU? - PullRequest
8 голосов
/ 18 января 2012

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

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

Лучше ли:

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

Ответы [ 2 ]

8 голосов
/ 18 января 2012

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

Существует также Библиотека приблизительных математических вычислений Intel , которая имеет среди прочих функцию log2 - она ​​старая (2000), но это SSE2 и она все еще должна работать достаточно хорошо.


Смотри также:
2 голосов
/ 18 января 2012

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

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

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

, где a - основание созданной вами логарифмической подпрограммы.

...