2012-01-17 13 views
8

Robię kilka obliczeń statystycznych. Potrzebuję ich, aby były szybkie, więc przepisałem większość z nich na SSE. Jestem całkiem nowy, więc zastanawiałem się, jakie jest właściwe podejście:Logarytm z SSE lub przejście na FPU?

Według mojej wiedzy, nie ma funkcji log2 ani ln w SSE, przynajmniej nie do wersji 4.1, która jest najnowszą wersją obsługiwane przez sprzęt, którego używam.

Czy lepiej:

  1. ekstraktu 4 pływaków i zrobić na nich obliczeń FPU do określenia entropii - I nie trzeba będzie ładować żadnej z tych wartości z powrotem do rejestrów SSE, tylko zsumować je do inny pływak
  2. znaleźć funkcję dla wiatru, który nie log2
+0

Jaki zakres i dokładność jest potrzebna do log2? –

+0

Taka sama dokładność, jaką uzyskuję z jednostki FPU, byłaby pożądana. –

+1

Wydaje się, że istnieje kilka implementacji logów SSE wokół, np. http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html –

Odpowiedz

8

Wydaje się, że istnieje kilka implementacji SSE log2 wokół, np. this one.

Istnieje również Intel Approximate Maths Library, który ma między innymi funkcję log2 - jest stara (2000), ale jest to SSE2 i powinna nadal działać dość dobrze.


Zobacz także:

+1

Z powodu metody zastosowanej na blogu, funkcja jest teraz związana z pamięcią zamiast z CPU. Rozwinąłem trochę pętlę, aby użyć jakiejś miłości _mm_prefetch i nadal jest ona związana pamięcią. Dzięki za ten niesamowity wskaźnik! –

+0

Cieszę się, że to zadziałało. Prawdopodobnie już to wiesz, ale jeśli uderzasz w wąskie gardło przepustowości pamięci, spróbuj połączyć inne operacje z log2, aby lepiej wykorzystać dane podczas przechowywania w pamięci podręcznej. –

+1

Jeśli aktualizujesz swoją odpowiedź, możesz wspomnieć o libmvec, który jest dostarczany z najnowszym glibc. –

1

brak instrukcji SSE, który implementuje funkcję logarytmu. Jednak nie ma też jednej instrukcji x86, która wykonuje również ogólny logarytm. Jeśli myślisz o użyciu funkcji logarytmu, takiej jak log lub log10 ze standardowej biblioteki C, warto rzucić okiem na implementację, która jest używana w bibliotece o otwartym kodzie źródłowym, takiej jak libc. Możesz łatwo przetworzyć własne przybliżenie logarytmu, które działa we wszystkich elementach rejestru SSE.

Taka funkcja jest często realizowana za pomocą wielomianowej aproksymacji, która jest ważna w pewnych specyfikacjach dokładności w pewnym regionie argumentów wejściowych, takich jak seria Taylora. Następnie można skorzystać z właściwości logarytmu, aby zawrzeć ogólny argument wejściowy w dopuszczalnym zakresie wejściowym dla procedury logarytmicznej. Ponadto, można sparametryzować podstawę logarytmu wykorzystując właściwości:

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

Gdzie a jest podstawa logarytmu rutyny, który został utworzony.