記憶體暫停

Store_Forwarding_Blocked 是一個警告。

為其發出 Store_Forwarding_Blocked 的指令在前一條將數據寫入重疊記憶體空間的指令之後讀取數據。如果以下情況之一屬實,將發生此暫停:

儲存轉發中的大小與對齊限制

儲存轉發中的大小與對齊限制

如需有關詳細資訊,請參閱線上英特爾(R) (R) 奔騰(R) 4 處理器手冊

備註

對於含“第三代數據流單指令多數據擴充套件指令集”(SSE3) 的英特爾(R) 奔騰(R) 4 處理器上,只同上述情形 b) 與 c) 有關。也就是說,僅在以下情況中才會發生懲罰:小數據元素的寫入後跟相同地址的大數據元素讀取。

建議

使用以下指令之一讀取要使用 MMX(TM) 技術指令處理的數據:

使用寫入 64 位運算元的 MMX 技術指令寫入 64 位四字(例如 MOVQ MM0, m64)。

示例(避免記憶體大小暫停):

此示例將讀取放在離寫入很遠的單獨循環中,從而避免暫停:

 

原始程式碼

優化程式碼

unsigned short array[1000]; for (i = 0 ; i < 1000 ; i +=2) { array[i] = i; array[i+1] = i + 1; rst1[i/2] = *(unsigned long *) &array[i]; }

unsigned short array[1000]; for (i = 0 ; i < 1000 ; i +=2) { array[i] = i; array[i+1] = i + 1; } for (i = 0 ; i < 500 ; i++) { rst1[i] = *(unsigned long *) &array[i *2]; }

在每一遍循環中,此程式碼將 2 個位元組寫入 array[i] 的地址,將 2 個位元組寫入地址 array[i] 的偏移量(即 array[i+1]),然後從地址 array[i] 讀取 4 個位元組。每次讀取都導致一次暫停。

此程式碼在第一個循環內將所有的數據寫入兩個陣列元素,從而避免暫停。
然後,它在單獨的循環中執行所有的讀取。

示例(避免記憶體對齊暫停):

此示例將讀取放在離它們前面的寫入很遠的位置,從而避免暫停。

 

原始程式碼

優化程式碼

for (i = 0 ; i < 1000 ; i +=2) { array[i] = i; rst2[i] = *(unsigned short *) ((unsigned char *)&array[i] + 1); }

for (i = 0 ; i < 1000 ; i +=2) { array[i] = i; } for (i = 0 ; i < 1000 ; i +=2) { rst2[i] = *(unsigned short *) ((unsigned char *)&array[i] + 1); }

在每一遍循環中,此程式碼將 2 個位元組寫入地址 array[i],然後從地址 array[i] 的偏移量(即 array[i] + 1)讀取 2 個位元組。
每次讀取都導致一次暫停。

此程式碼首先在一個循環內將所有的數據寫入地址 array[i],從而避免暫停。
然後,它在一個單獨的循環中,從該地址的偏移地址執行所有的讀取。

記憶體懲罰  

影響的處理器