2012-02-24 11 views
2

SSE(AVX)でintとfloatの両方を扱うときは、すべてのintを浮動小数点数に変換して浮動小数点数でのみ動作させることをお勧めしますか? それ以降はほんの少しのSIMD命令が必要なので、私たちが使用する必要があるのは、この変換を完全に保持する必要がある加算命令と比較命令(<, <=, ==)です。SSE ints vs. floats実践

+3

理想的には、整数ではなく浮動小数点数を取り除くことは理想的です。インチは、より速く、より良いと強くなります:) –

+0

SSEでさえ???私は確信していません。私たちは浮動小数点を取り除くことはできません。明らかに、int型の '4 - > 4.00000'の変換はOKですが、等価を保持する必要があります。 – Cartesius00

+5

あなたは何をしようとしているのかの例を示す必要があります。 'int'!=' float'です。また、AVXはまだ256ビット幅の整数演算をサポートしていません。 (AVX2 will)だから私はあなたがこれをしたい理由を理解することができます。それがより速くなるかどうかは、あなたがしようとしていることに大きく依存します。 – Mysticial

答えて

6

私のコメントを回答に拡大します。

基本的に次のようなトレードオフを計量:整数と

スティック:

  • 整数SSEは、低レイテンシ、高スループットです。 (Sandy Bridgeのデュアル発行)
  • 128ビットSIMD幅に制限されています。

浮動小数点への変換:256ビットのAVXから

  • 給付。
  • 単一の問題の加算/減算(Sandy Bridge上)のみ
  • 最初の変換オーバーヘッドが発生します。
  • 正確度の低下なしにfloatに収まるものに入力を制限します。

私は今のところ整数に固執します。 floatバージョンのコードを複製したくない場合は、それがあなたの呼び出しです。

整数を浮動小数点でエミュレートする速度が速くなったのは、除算が必要なときだけです。


手作業によるベクトル化のダイビングは、パフォーマンスがより重要であることを意味するため、わかりやすさについては言及していません。

+0

AVX浮動小数点はSandy Bridgeでは単発ではありません。正確な特性は簡潔に記述するのが難しいですが、Sandy BridgeはFP加算を実行し、すべてのサイクル(ロード、ストア、および置換のいくつかの組み合わせ)を掛けることができます。詳細については、インテル®最適化マニュアルの2.1.4を参照してください。 (公正では、質問者は乗算をしていないようですので、あなたは完全にマークではありません) –

+0

私はadd + mulの問題をよく知っています(何らかのシャッフルと一緒に)。しかし、はい、私はFP-追加が単発であることを指していました。 (私はそれについてもう少し明確にできたと認めますが) – Mysticial