Bank_Conflict 表示一種懲罰狀態。
在奔騰(R) 處理器的數據快取中,數據包含八個數據塊,各數據塊之間有四個位元組的邊界重疊。U 管道 與 V 管道中的指令可以同時訪問數據快取。不過,兩條指令訪問相同的數據快取數據塊時,將發生數據塊衝突。發生數據塊衝突時,指令對暫停一個週期。
僅當指令的基址或變址暫存器值相差 32(或 32 的倍數)位元組時,“VTune(TM) 效能分析器”才指出存在此懲罰狀態。
建議
要避免數據塊衝突:
重新調整程式碼順序,以便訪問相同數據塊的兩條指令不成對。
重新調整數據順序。
此例顯示如何通過在 SAL 移位指令之後插入 CMP 指令(寫入所有標誌)來避免暫停。
示例:
原始程式碼 |
週期 |
優化程式碼 |
週期 |
|
1 2 2 3 |
1. mov ecx, mem 3. add eax, 4 2. mov edx, mem+32 4. 4 add ebx ,4 |
|
儘管“指令 1”與“指令 2”可以成對。但由於訪問 MEM 與 MEM+32 時將發生數據塊衝突,所以此指令對暫停一個週期。 執行時間總計:3 個週期 |
在優化的程式碼中,程式碼序列經過重新調整,從而避免“指令 1”與“指令 2”之間的數據塊衝突。 執行時間總計:2 個週期 |