2012-01-17 116 views
3

如何禁用全局或特定的for循環的自動矢量化(SSE2),但不會在MSVS 2010中恢復爲/ Od?Microsoft C++編譯器:如何禁用/ O2自動矢量化?

我試過Enable Enhanced Instruction Set所有3種可能的選項,包括「未設置」,都無濟於事。

P. S.奇怪的是,偶數/ Od沒有幫助。

+2

只是好奇:爲什麼? – 2012-01-17 21:00:19

+2

@DanielFischer:爲什麼我想禁用向量化?出於兩個原因:評估使用SSE2後的性能提升,並與沒有SSE的機器進行一致且有意義的性能比較。 – 2012-01-17 21:01:12

+2

也許以下可能是相關的:http://stackoverflow.com/questions/1480916/how-do-i-enable-the-sse-sse2-instruction-set-in-visual-studio-2008-using-cmake – NPE 2012-01-17 21:06:42

回答

2

對於一個特定的循環,你可以添加一個編譯:

#pragma loop(no_vector) 

這實際上是documented on MSDN(雖然我只發現它有後,我瞭解了吧..)

如果你不這樣做喜歡添加一個雜注,你可以選擇編譯/favor:ATOM。這有點破解,但它可以讓你禁用自動矢量化,而不用觸摸源,並且仍然優化速度。

或者有兩種優化策略/O1「優化大小」和/Os「有利於小代碼」。自動矢量化會生成更多的代碼,所以如果您對大小進行了優化,則會禁用自動矢量化。

我通過閱讀auto-vectorization cookbook瞭解了這一切。請參閱「循環體規則」部分的最後一行。免責聲明:我實際上並沒有使用VS2012編譯器(需要支持Win XP),所以我沒有測試過這個。此外,編譯器開關在2013年或以後可能會有所不同。

+0

感謝您的鏈接!順便說一句,你有沒有看到XP有一個特殊的vc11運行時?我相信你可以在XP中使用2012編譯器和運行時。 – 2013-09-14 21:12:42

2

你可以在分離功能隔離您for循環,並嘗試使用#pragma optimize它:

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

// your function here 

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

...但是這應該只是有對特定功能的/Od同樣的效果,所以它可能沒有幫助。

如果您正在爲x86編譯(而不是x86_64,它不起作用),您也可以整體禁用SSE2指令集(刪除/arch:SSE2選項)。可悲的是,其粒度限於整個源文件。

+0

謝謝,這應該工作 -/od中的矢量化只發生在x64(爲什麼?),但這並不完全是我想要的,因爲循環計數器甚至沒有鎖定在/ Od中的寄存器中。性能影響不僅僅是由於矢量化。 – 2012-01-17 21:30:35

0

請確保沒有設置/arch編譯器選項。

+0

我做過了,沒有設置。 – 2012-01-17 21:19:24

0

哪個編譯器? AFAIK,VS將從版本11開始實現自動向量化。VS使用SSE指令來實現浮點,但這並不意味着它實際上是向量化循環。

+0

VC 2010。你的意思是我誤解了術語「矢量化」? – 2012-01-17 21:59:20

+0

我這麼認爲,是的。 – zvrba 2012-01-18 09:13:30