2012-01-17 3 views
8

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

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

Что лучше:

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

Какой диапазон и точность вам нужно для вашего log2? –

+0

То же самое, что я получаю от FPU. –

+1

Кажется, что существует несколько реализаций SSE log2 вокруг, например. http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html –

ответ

8

Существует, по-видимому, несколько вариантов SSE log2, например. this one.

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


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

+1

. Благодаря методу, используемому в блоге, функция теперь привязана к памяти, а не к привязке к ЦП. Я немного развернул цикл, чтобы использовать некоторую любовь _mm_prefetch, и она по-прежнему связана с памятью. Спасибо за этот замечательный указатель! –

+0

Рад, что это сработало для вас. Вы, наверное, уже это знаете, но если вы столкнулись с узким местом пропускной способности памяти, попробуйте объединить другие операции с вашим логом2, чтобы вы больше использовали данные, находясь в кеше. –

+1

Если вы обновляете свой ответ, вы можете упомянуть libmvec, который поставляется с последним glibc. –

1

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

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

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

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