2013-03-06 6 views
5

私は私のCPU時間(プロファイラによる)の10%を中心に、合計で、取り_ftol2_sse、より速いオプションはありますか?

int myNumber = (int)(floatNumber); 

の多くを呼び出すコードを持っています。私はそのままにしておくこともできますが速くオプションがある場合、私は疑問に思うので、私は周りに検索しようとした、と

http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/ http://stereopsis.com/FPU.html

私はそこに与えられたReal2Int()関数を実装しようとしたつまずいしかし、それは私に間違った結果をもたらし、遅くなります。今、私は疑問に思っています。フロア値を整数に変換するより高速な実装があるのでしょうか、それともSSE2バージョンは速いですか?私が見つけたページはちょっと戻ってきたので、ちょうど時代遅れかもしれないし、新しいSTLはこれより速い。

現在の実装ではありません:私が見つけた

013B1030 call  _ftol2_sse (13B19A0h) 

013B19A0 cmp   dword ptr [___sse2_available (13B3378h)],0 
013B19A7 je   _ftol2 (13B19D6h) 
013B19A9 push  ebp 
013B19AA mov   ebp,esp 
013B19AC sub   esp,8 
013B19AF and   esp,0FFFFFFF8h 
013B19B2 fstp  qword ptr [esp] 
013B19B5 cvttsd2si eax,mmword ptr [esp] 
013B19BA leave 
013B19BB ret 

関連質問:

Fast float to int conversion and floating point precision on ARM (iPhone 3GS/4)

What is the fastest way to convert float to int on x86

を両方が古い、またはARMベースなので、私はそこにいるのだろうかこれを行う現在の方法。最高のコンバージョンは起こらないものであると言われていますが、私はそれを持つ必要があるため、不可能です。

答えて

6

一般的なx86ハードウェアをターゲットにしている場合は、それを打ち負かすのは難しいでしょう。ランタイムでは、ターゲットマシンにSSEユニットがあるかどうかはわかりません。もしそうなら、それはx64コンパイラが行うことと、オペコードcvttss2siをインライン化することができます。しかし、ランタイムはSSEユニットが使用可能かどうかをチェックする必要があるため、現在の実装が残っています。これがftol2_sseの実装です。さらに、x87レジスタの値を渡し、SSEユニットが利用可能であれば、それをSSEレジスタに転送します。

x86コンパイラにSSEユニットを持つマシンを対象とすることができます。コンパイラは実際にop37のインラインで単純なcvttss2siを発行します。それはあなたが得るほど速くなるでしょう。しかし、古いマシンでコードを実行すると失敗します。おそらく、あなたはSSEを持つマシン用と、そうでないマシン用の2つのバージョンを提供することができます。

それはあなたのすべてをあまり得られません。作業を行うオペコードcvttss2siに実際に到達する前に発生するftol2_sseのオーバーヘッドをすべて避けるだけです。

IDEからコンパイラ設定を変更するには、「プロジェクト」>「プロパティー」>「構成プロパティー」>「C/C++」>「コード生成」>「拡張命令セットを使用」を使用します。コマンドラインでは/ arch:SSEまたは/ arch:SSE2です。

+0

x64コードで完璧です。これはもっと速く動作します! – SinisterMJ

1

doubleのために私はあなたが多くの結果を改善することができるようになりますとは思わないが、あなたはfloat Sの多くが詰め込ま変換を使用して助けることができることを変換する必要があれば、次はnasmコードです:

global _start 

section .data 
    align 16 
    fv1: dd 1.1, 2.5, 2.51, 3.6 

section .text 
    _start: 

    cvtps2dq xmm1, [fv1] ; Convert four 32-bit(single precision) floats to 32-bit(double word) integers and place the result in xmm1 

簡単な方法で同じことをするための組み込みコードが必要ですが、組み込み関数ライブラリを使用するのに慣れていません。 gccを使用していないにもかかわらず、この記事Auto-vectorization with gcc 4.7は、良いベクトル化されたコードを生成するためにコンパイラを得ることがどれほど難しいかを見ています。

1

ターゲットマシンの速度と基盤が必要な場合は、すべてのアルゴリズムの高速SSEバージョンと一般的なバージョンを導入し、より高いレベルで実行されるアルゴリズムを選択することをお勧めします。

これはまた、ABIもSSE用に最適化されていることを意味します。利用可能な場合は計算をベクトル化でき、また制御ロジックもアーキテクチャに最適化されていることが必要です。

btw。 FLD; FISTシーケンスでさえ、Pentiumでは〜7クロックサイクルを超えてはなりません。

+3

正しい切り捨てを得るには、丸めモードを変更する必要があります。私が知る限り、x87ステータスワードを変更するのは遅いです。 –

+0

@ infactのコメントは正確です –

+0

良い点。それから、状態の単語_often_を変更しないことが理にかなっています。 –

関連する問題