Store_Forwarding_Blocked 是一個警告。
為其發出 Store_Forwarding_Blocked 的指令在前一條將數據寫入重疊記憶體空間的指令之後讀取數據。如果以下情況之一屬實,將發生此暫停:
讀取指令和寫入指令的目標記憶體地址不相同。
讀取和寫入指令的目標記憶體地址與相同的地址對齊,但讀取的數據大於寫入的數據。
如需有關詳細資訊,請參閱線上英特爾(R) (R) 奔騰(R) 4 處理器手冊。
對於含“第三代數據流單指令多數據擴充套件指令集”(SSE3) 的英特爾(R) 奔騰(R) 4 處理器上,只同上述情形 b) 與 c) 有關。也就是說,僅在以下情況中才會發生懲罰:小數據元素的寫入後跟相同地址的大數據元素讀取。
使用以下指令之一讀取要使用 MMX(TM) 技術指令處理的數據:
讀取 64 位運算元的 MMX 技術指令(例如 MOVQ MM0, m64)。
操作四字記憶體運算元的任何 MMX 技術指令的暫存器-記憶體形式(例如 PMADDWD MM0, m64)。
使用寫入 64 位運算元的 MMX 技術指令寫入 64 位四字(例如 MOVQ MM0, m64)。
此示例將讀取放在離寫入很遠的單獨循環中,從而避免暫停:
原始程式碼 |
優化程式碼 |
|
|
在每一遍循環中,此程式碼將 2 個位元組寫入 array[i] 的地址,將 2 個位元組寫入地址 array[i] 的偏移量(即 array[i+1]),然後從地址 array[i] 讀取 4 個位元組。每次讀取都導致一次暫停。 |
此程式碼在第一個循環內將所有的數據寫入兩個陣列元素,從而避免暫停。 |
此示例將讀取放在離它們前面的寫入很遠的位置,從而避免暫停。
原始程式碼 |
優化程式碼 |
|
|
在每一遍循環中,此程式碼將 2 個位元組寫入地址 array[i],然後從地址 array[i] 的偏移量(即 array[i] + 1)讀取 2 個位元組。 |
此程式碼首先在一個循環內將所有的數據寫入地址 array[i],從而避免暫停。 |