Где я могу найти хорошую реализацию exp(double) с использованием инструкций SSE2 на x86/x64?

Я установил, что реализации Microsoft exp(double) в библиотеке C VS2010 используют разные алгоритмы на платформах Win32 (т. е. 32-разрядная x86) и x64, хотя я включил SSE2 для платформы x86 и проверил, путь кода берется в exp(). К сожалению, разные алгоритмы дают немного разные результаты (на 1ulp) для некоторых операндов. В этих случаях любой результат для нас в принципе приемлем, но отсутствие согласованности между сборками Win32 и x64 создает для нас проблемы при тестировании. Где я могу найти хорошую (то есть точную и быструю) альтернативную реализацию exp(double), которую я могу использовать на обеих платформах? Я был бы рад получить решение для ассемблерного кода с использованием инструкций SSE2, и я могу перевести его с 32 на 64 бита или v.v. если необходимо.


person dc42    schedule 30.05.2013    source источник


Ответы (1)


Вероятно, лучше положиться на компилятор и использовать реализацию exp с http://www.netlib.org/fdlibm/e_exp.c . Это точная реализация (1ulp). Скомпилируйте с включенным sse2 для x86 и x64, и результаты должны быть одинаковыми на этих платформах. Исходный код не предлагает много возможностей для использования mulpd (или _mm_mul_pd) и addpd вместо mulsd и adds. Поэтому решение на ассемблере может быть не очень прибыльным.

person wim    schedule 31.05.2013