我正在研究一些旨在在32位模式下在x86上運行的代碼。在這種模式下,我明白我只有8個SIMD/AVX2寄存器(YMM0-7)可以自由使用。然而,單獨的一些矢量子程序有時候會使用的寄存器數量超過了這個數量(這意味着它們仍然需要在路上的某個地方 - 大多數情況下並不是那麼晚)。導出寄存器對堆棧的性能影響是什麼?
我的理解是,當編譯器找不到未使用的寄存器時,會將較舊的寄存器導出到堆棧存儲器。但這對性能有多大影響? (例如稍後在每個導出/導入的週期中)。我可以信任大部分駐留在L1-D-Cache中的堆棧內存(Haswell中有2個週期的延遲),還是存在避免這種寄存器到內存(反之亦然)傳輸的顯着性能影響?
到目前爲止,我無法找到答案的這個話題,特別是因爲寄存器保持越來越大(每個寄存器1級的高速緩存行與即將到來的SKYLAKE微架構平臺)。如果你回答的話可以提供資料,這將是很好的。
你的代碼,當然會比較慢。如果您想了解多少,那麼簡單地分析您的代碼,比較32位和64位版本。只有你可以做到這一點。 – 2014-09-06 20:58:53
出於好奇。你爲什麼只限於32位模式? Core2在九年前就出來了。由於Nehalem(2008)的宏觀操作融合工作在64位模式下。明年推出的AVX512將在64位模式下有32個AVX512寄存器,在32位模式下只有8個。爲什麼要限制你的代碼只有32位模式? – 2014-09-07 09:18:01
我同意你們兩個。看起來我需要對它進行基準測試,看看它是否更好地調整我的內涵。需要32位支持,因爲有些工作站仍然只能運行32位操作系統。不過,問題將會是相同的,無論是8個還是16個註冊,都不太嚴重。 – 2014-09-08 09:25:35