如何禁用全局或特定的for
循環的自動矢量化(SSE2),但不會在MSVS 2010中恢復爲/ Od?Microsoft C++編譯器:如何禁用/ O2自動矢量化?
我試過Enable Enhanced Instruction Set
所有3種可能的選項,包括「未設置」,都無濟於事。
P. S.奇怪的是,偶數/ Od沒有幫助。
如何禁用全局或特定的for
循環的自動矢量化(SSE2),但不會在MSVS 2010中恢復爲/ Od?Microsoft C++編譯器:如何禁用/ O2自動矢量化?
我試過Enable Enhanced Instruction Set
所有3種可能的選項,包括「未設置」,都無濟於事。
P. S.奇怪的是,偶數/ Od沒有幫助。
對於一個特定的循環,你可以添加一個編譯:
#pragma loop(no_vector)
這實際上是documented on MSDN(雖然我只發現它有後,我瞭解了吧..)
如果你不這樣做喜歡添加一個雜注,你可以選擇編譯/favor:ATOM
。這有點破解,但它可以讓你禁用自動矢量化,而不用觸摸源,並且仍然優化速度。
或者有兩種優化策略/O1
「優化大小」和/Os
「有利於小代碼」。自動矢量化會生成更多的代碼,所以如果您對大小進行了優化,則會禁用自動矢量化。
我通過閱讀auto-vectorization cookbook瞭解了這一切。請參閱「循環體規則」部分的最後一行。免責聲明:我實際上並沒有使用VS2012編譯器(需要支持Win XP),所以我沒有測試過這個。此外,編譯器開關在2013年或以後可能會有所不同。
感謝您的鏈接!順便說一句,你有沒有看到XP有一個特殊的vc11運行時?我相信你可以在XP中使用2012編譯器和運行時。 – 2013-09-14 21:12:42
你可以在分離功能隔離您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
選項)。可悲的是,其粒度限於整個源文件。
謝謝,這應該工作 -/od中的矢量化只發生在x64(爲什麼?),但這並不完全是我想要的,因爲循環計數器甚至沒有鎖定在/ Od中的寄存器中。性能影響不僅僅是由於矢量化。 – 2012-01-17 21:30:35
哪個編譯器? AFAIK,VS將從版本11開始實現自動向量化。VS使用SSE指令來實現浮點,但這並不意味着它實際上是向量化循環。
VC 2010。你的意思是我誤解了術語「矢量化」? – 2012-01-17 21:59:20
我這麼認爲,是的。 – zvrba 2012-01-18 09:13:30
只是好奇:爲什麼? – 2012-01-17 21:00:19
@DanielFischer:爲什麼我想禁用向量化?出於兩個原因:評估使用SSE2後的性能提升,並與沒有SSE的機器進行一致且有意義的性能比較。 – 2012-01-17 21:01:12
也許以下可能是相關的: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