循環 8192 個元素時的效能影響
當矩陣大小(特別是行數)為2048 的倍數(例如 8192)。這種現像被稱為超級對齊,是由於現代 CPU 中的特定記憶體管理實踐而產生的。
提供的程式碼片段示範了這個問題,其中矩陣 res[][] 是根據矩陣 img[ 計算得出的][]。不同矩陣大小(特別是 8191、8192 和 8193)的表現顯示,當矩陣大小為 8192 時,表現顯著下降。
超級對齊效果
效能差異源於對矩陣的逐列迭代的嵌套循環導致的對記憶體的不均勻存取影像[][]。這種非順序存取模式會導致現代 CPU 的效能下降,而現代 CPU 透過順序記憶體存取可以更有效地運作。
解:互換外循環
解決方案在於重新排序巢狀循環,優先考慮行迭代而不是列迭代。透過這樣做,記憶體存取變得順序,顯著提高效能:
for(j=1;j<SIZE-1;j++) { for(i=1;i<SIZE-1;i++) { // Code to compute res[j][i] } }
效能結果
以下效能結果顯示了透過交換外循環實現的改進:
Matrix Size | Original Code (s) | Interchanged Loops (s) |
---|---|---|
8191 | 1.499 | 0.376 |
8192 | 2.122 | 0.357 |
8193 | 1.582 | 0.351 |
此最佳化大大減少了維度為以下倍數的矩陣的表現差距2048,從而在不同的矩陣大小上獲得一致的性能。
以上是為什麼循環 8192 個元素比 8191 或 8193 慢很多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!