2012-01-17 5 views
8

統計計算をいくつか行っています。私はそれらを速くする必要があるので、私はSSEを使うためにそのほとんどを書き直しました。私はかなり新しいので、ここで正しいアプローチが何であるか疑問に思っていました:SSEを使用する対数、またはFPUに切り替えますか?

私の知る限り、SSEにはlog2またはln関数はありません。少なくとも4.1までは最新バージョンです私が使用するハードウェアでサポートされています。

  1. エキス4台の山車、そしてenthropyを決定するためにそれらの上に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

log2の機能を持つIntel Approximate Maths Libraryもあります。これは古いですが(2000年)、それはSSE2であり、やはり正常に動作するはずです。


も参照してください:

+1

ブログで使用されているメソッドのため、関数はCPUバインドではなくメモリバインドになりました。私はいくつかの_mm_prefetch愛を利用するためにループを少し展開しました。それでもメモリに束縛されています。そのすばらしいポインタありがとう! –

+0

それはあなたのために働いてうれしい。おそらくこれはすでに分かっているはずですが、メモリ帯域幅のボトルネックを起こしている場合は、他の操作とlog2を組み合わせて、キャッシュに入っている間にデータをより多く使用するようにしてください。 –

+1

答えを更新する場合は、最近のglibcに同梱されているlibmvecについて言及したいと思うかもしれません。 –

1

を行うSSEための機能を見つけます。しかし、一般的な対数を実行する単一のx86命令もありません。 loglog10のような対数関数をC標準ライブラリから使用することを考えているなら、libcのようなオープンソースライブラリで使用されている実装を見てみる価値があります。 SSEレジスタのすべての要素で動作する独自の対数近似を容易にロールバックできます。

このような関数は、テイラー級数のような入力引数の特定の領域に対してある精度仕様で有効な多項式近似を使用して実装されることがよくあります。対数プロパティを利用して、汎用入力引数を対数ルーチンの許容入力範囲にラップすることができます。また、あなたが財産を利用することによって対数の底をパラメータ化することができますaはあなたが作成した対数ルーチンのベースである

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

関連する問題