2011-08-10 4 views
2

インテルのSSEで私の最初のステップを踏み出そうと思っていたので、ガイドはhereで公開されましたが、WindowsとC++用に開発する代わりにLinuxとC _aligned_mallocではなく、posix_memalign)を使用しないでください。SSEに最適化されたコードはプレーンバージョンと似ています

また、SSE拡張機能を使用せずに1つのコンピューティング集中型メソッドを実装しました。驚くべきことに、私がプログラムを実行すると、両方のコード(SSEとそれ以外のもの)が実行に似た時間を費やします。通常、SSEをもう片方より少し上回る時間です。

これは正常ですか? GCCが既にSSEで最適化している可能性はありますか(また、-O0オプションを使用して)?私も-mfpmath=387オプションを試しましたが、方法は変わりません。

+0

どのCPUを使用していますか? –

+0

私はIntel Core i7 M640 2.80GHzを使用しています。 –

+0

OK - 下の「私の答え」を参照してください。また、コードをビルドするために使用しているコマンドラインを投稿することもできます。 –

答えて

2

浮動小数点演算の場合、SSEに大きな利点はありません。最新のx86 CPUには2つのFPUがありますので、倍精度はSIMDとスカラーでほぼ同じ速度になり、単精度では良い日にスカラーと比べて2倍のSIMDが得られます。しかし、整数演算の場合、例えば。 8ビットまたは16ビットでの画像処理やオーディオ処理でも、SSEで大きなメリットを得ることができます。

+0

これが原因かもしれません。私は単精度バージョンを試します。 –

+1

OK - あなたの質問にもコードとコマンドラインを追加してください。SIMDで作業を開始するときに間違っていることが非常に多くあります。 –

+2

あなたは正しいと思います。ポールR. 32ビット整数を使用するバージョンでは、約2倍のスピードアップが得られます。私は、16ビットと8ビットの演算では、その利点はさらに優れていると思います。ちなみに、私は整数バージョンで平方根演算を削除しました。どうもありがとう。 –

1

GCCには非常に優れた組み込みコードベクタライザーがあります(iircは-O0以上で起動します)。これは、スカラーコードを高速化するためにSIMDを使用できることを意味しますSIMDコードも可能です)。

これは確かにここで何が起こっているかを簡単に確認して、出力を逆アセンブルします(またはgccでコメント付きのasmファイルを出力します)。

+0

私はアセンブラコードをチェックしました。私は明示的な(少なくとも)SSEを持つコードから予想されるaddps命令のペアを見ています。 –

+1

自動ベクトル化は、O2やO3で起動するだけの非常に重い最適化であるため、O0(最適化なし)では機能しないとは思っていません。 –

+0

gccのmanページを見ると、 '-ftree-vectorize'は' -O3'で設定されています。これはDebian/Ubuntu上にあり、他のプラットフォームでは異なるかもしれません。慎重に、 '-O0'は0の最適化です。最適化が '-O1'から始まります –

関連する問題