2012-01-17 6 views
3

MSVS 2010の/ Odに戻さずに、グローバルに、または特定のforループに対して、自動ベクトル化(SSE2)を無効にする方法はありますか?Microsoft C++コンパイラ:/ O2で自動ベクトル化を無効にする方法はありますか?

"未設定"を含むEnable Enhanced Instruction Setの3つのオプションをすべて試しましたが、無駄です。

P. S.奇妙なことに、偶数/奇数は役に立たない。

+2

ちょっと好奇心:なぜ? –

+2

@DanielFischer:なぜベクトル化を無効にしたいのですか? 2つの理由から、SSE2の使用によるパフォーマンスの向上を評価し、SSEを持たないマシンとの一貫性があり有意義なパフォーマンスの比較を可能にする。 –

+2

おそらく、以下が関連するかもしれません:http://stackoverflow.com/questions/1480916/how-do-i-enable-the-sse-sse2-instruction-set-in-visual-studio-2008-using-cmake – NPE

答えて

2

、あなたはプラグマを追加することができますが(私はそれについて学んだ後、私はそこだけそれを見つけたが...)

#pragma loop(no_vector) 

これは実際documented on MSDNある

あなたはそうではない場合プラグマを追加するように、/favor:ATOMでコンパイルすることができます。これはちょっとしたハックですが、ソースに触れることなく自動ベクトル化を無効にし、それ以外の場合は速度を最適化することができます。

また、2つの最適化戦略/O1「最適化サイズ」と/Os「小さいコードを優先」があります。自動ベクトル化は実質的により多くのコードを生成するので、サイズを最適化すると、自動ベクトル化は無効になります。

私はこれを最近、auto-vectorization cookbookを読んでから学びました。 「ループ本体の規則」の節の最後の行を参照してください。

免責事項:実際にVS2012コンパイラを使用していない(Win XPをサポートする必要がある)ので、これはテストしていません。また、2013年以降にコンパイラスイッチが異なる方法で動作する可能性があります。

+0

リンクありがとう!ところで、XP用の特別なvc11ランタイムがあるのを見たことがありますか?私はあなたが2012年のコンパイラとランタイムをXPでどのように使うことができるのかと信じています。 –

2

あなたは分離機能であなたのforループを分離し、そのための#pragma optimizeを使用するように試みることができる:

// Disable all optimizations 
#pragma optimize("", off) 

// your function here 

// Enable them back 
#pragma optimize("", on) 

を...しかし、これだけでは、特定の機能に/Odのと同じ効果を持っている必要があり、それはかもしれません助けません。

x86_64ではなく、x86_64用にコンパイルする場合は、SSE2命令セット全体を無効にすることもできます(/arch:SSE2オプションを削除する)。残念ながら、その粒度はソースファイル全体に限定されています。

+0

ありがとう、それは働くべきです -/Odのベクトル化はx64(なぜ?)でしか起こりませんが、ループカウンタは/ Odのレジスタにロックされていないので、パフォーマンスへの影響は、ベクトル化に起因するだけではありません。 –

0

/archコンパイラオプションが設定されていないことを確認してください。

+0

しましたが、設定されていません。 –

0

どのコンパイラ? AFAIK、VSはバージョン11から自動ベクトル化を実装します.VSは浮動小数点のSSE命令を使用しますが、実際にループをベクトル化するわけではありません。特定のループのために

+0

VC 2010.「ベクトル化」という用語を誤解していますか? –

+0

そうだと思います。 – zvrba

関連する問題