最初,提出了關於組合循環中執行的元素加法之間的性能差異的問題循環與單獨循環。然而,後來對其進行了修改,以深入了解導致這些效能變化的快取行為。
為什麼逐元素加法在單獨的情況下明顯更快循環比組合循環?
進一步分析,是認為此行為是由操作中使用的四個指標的資料對齊問題引起的,可能導致快取群組/路衝突。具體來說,數組很可能分配在同一頁行上,導致每個循環內的存取落在同一高速緩存路徑上。這比將存取分佈在多個快取方式上的效率要低,這在單獨分配數組時是可能的。
您能否提供一些深入了解導致不同快取行為的細節,如以下五個區域所示圖?
區域 1: 資料集非常小,效能主要由開銷(例如循環和分支)決定,而不是快取行為。
區域 2: 先前歸因於對齊問題,進一步分析顯示該區域的效能下降需要進一步調查。緩存組衝突仍然可能是一個因素。
區域 3:資料大小超過 L1 快取容量,導致 L1 到 L2 快取頻寬造成效能限制。
區域 4: 在單循環版本中觀察到的效能損失可能是由於處理器中的錯誤混疊停頓造成的由陣列對齊引起的載入/儲存單元。當處理器推測性地執行載入操作並遇到使用不同值對相同位址進行第二次載入時,就會發生錯誤別名。在這種情況下,處理器必須丟棄推測載入並重新載入正確的值,從而導致效能損失。
區域 5: 此時,資料大小超出了兩者的容量L1 和 L2 緩存,導致記憶體頻寬帶來效能限制。
透過為這些 CPU 提供類似的圖表來指出 CPU/快取架構之間的差異也可能很有趣。
提供的圖表表示從兩個 3.2 GHz 的 Intel Xeon X5482 Harpertown 處理器收集的資料。對其他架構(例如英特爾酷睿 i7 870 @ 2.8 GHz 和英特爾酷睿 i7 2600K @ 4.4 GHz)進行的類似測試生成的圖表顯示了類似的區域,但具體性能值可能有所不同。這些差異可歸因於快取大小、記憶體頻寬和其他架構特徵的差異。
以上是考慮到快取行為,為什麼單獨循環中的元素添加比單一循環更快?的詳細內容。更多資訊請關注PHP中文網其他相關文章!