2011-11-14 10 views
3

GCCでSSE2を使用するにはどうすればよいですか? 私は二重の値で作業したいです。GCCでの二重計算のSSE2

I検索s.th.このように: http://vrm-vrm.blogspot.com/2009/10/gcc-intrinsics.html 二重値の場合のみ。

+0

'-msse'などで、' -march = native'でコンパイルするだけでもいいです... –

+0

それはすべてですか?私はそれが複雑になるだろうと聞き、組み込み関数を使用する必要があります。 –

+2

明示的な構造を使用する場合は、組み込み関数を使用する必要があります。コンパイラのフラグを使用すると、使用可能な場合、およびオプティマイザが適切な選択肢であると判断した場合に、ハードウェアを使用することはコンパイラに指示するだけです。いくつかの '-O'レベルと組み合わせて使用​​します。保証はありませんが、試してみて、アセンブリを比較してください。 –

答えて

4

SSE2 double insnsを使用する場合は、gcc -mfpmath=sse -msse2でコンパイルする必要があります。

オプション-msse2だけでSSE2組み込み関数を使用できるようになると、-mfpmath=sseはGCCにすべてのFP操作のSSE2 insnsを出力させます。

ベクター化は-O3で有効になっています。

ベクトルSSE2-4用のinsnの利点は明らかであり、サンディブリッジプロセッサは、サイクルごとに3つの256ビット演算まで実行することができる(例えば、4回のダブル乗算、4つの二重付加およびその上にいくつかのシャッフル)

しかし、インテルの最適化マニュアルでは、従来のx87 insnsと比較して、フラット・レジスタ・モデルや短いレイテンシなどの理由で、スカラー操作でもSSEを使用することを推奨しています。

EDIT:

は言及を忘れ、32ビットコードのために、あなたはまた、FPの引数と戻り値は、SSEレジスタを経由して渡されることになりますどの、-msseregparmを追加することができます。デフォルトでは、メモリにはそれぞれ%st0が渡されます。当然、これはABIを変更するので、相互作用するすべてのモジュールをこのオプションでコンパイルする必要があります。

+0

メモリが正しく機能する場合、64ビットABIではx87はまったく使用されません。 – phkahler

+0

@phkahler、yes、x87が使用されているときに 'long double'演算を除いて、当然です。 – chill