5

多くを呼び出すコードがあります

int myNumber = (int)(floatNumber);

これは合計で、CPU 時間の約 10% を占めます (プロファイラーによると)。そのままでもいいのですが、もっと早い方法はないかと思い、いろいろ探してみたらたまたま出てきました

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

そこで指定された Real2Int() 関数を実装しようとしましたが、間違った結果が得られ、実行が遅くなります。double/float 値を整数に変換するためのより高速な実装があるのでしょうか、それとも 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  

私が見つけた関連する質問:

ARM での float から int への高速変換と浮動小数点精度 (iPhone 3GS/4)

x86でfloatをintに変換する最速の方法は何ですか?

どちらも古いか ARM ベースなので、これを行う現在の方法があるのだろうかと思います。最良の変換は起こらないものであると言われていますが、私はそれを持っている必要があるので、それは不可能です.

4

3 に答える 3

6

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

x86 コンパイラに、SSE ユニットを備えたマシンをターゲットにするように指示できます。次に、コンパイラは実際に単純なcvttss2siオペコードをインラインで発行します。それはあなたが得ることができるのと同じくらい速くなるでしょう。ただし、古いマシンでコードを実行すると失敗します。おそらく、SSE を備えたマシン用と備えていないマシン用の 2 つのバージョンを提供できます。

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

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

于 2013-03-06T13:27:06.417 に答える
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 を使用していませんが、この記事gcc 4.7 を使用した自動ベクトル化は、コンパイラーに優れたベクトル化されたコードを生成させることがいかに困難であるかを示す目を見張るものがあります。

于 2013-03-06T13:43:03.837 に答える
1

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

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

ところで。Pentium では、シーケンスでさえFLD; FIST7 クロック サイクル以内である必要があります。

于 2013-03-06T13:50:13.127 に答える