對Intel Sandybridge 系列CPU 中的管道進行去最佳化
本作業的目標是修改給定作業的程序以降低其性能,稱為去優化。此任務需要了解英特爾 i7 管道架構以及如何重新排序指令路徑以引入危險。
1.錯誤共享:
安排非原子變數儲存在同一快取行中,導致儲存轉送停頓。
2.儲存轉送停頓:
使用XOR 翻轉雙精度數的符號位,而不是使用「-」運算符,強制將窄儲存僅儲存雙精度數的一個位元組。
3.記憶體消歧:
將資料4096B分開放置,以觸發儲存到不同頁面的錯誤依賴關係。
4.未對齊的資料:
使用 __attribute__((packed)) 強制跨快取行或頁邊界的變數未對齊,從而增加快取未命中率。
5. Stride:
以 4096 位元組的步幅循環數組,導致記憶體存取不連續,降低快取利用率。
6.鍊錶:
將結果儲存在鍊錶中,引入指標追逐負載依賴關係以及記憶體中潛在的分散節點。
1。原子變數:
使用std::atomic
2. Long double:
使用 long double 變數強制 x87 模擬,即使使用支援 SSE2 的 CPU。
3.整數轉換:
在整數和浮點類型之間重複轉換,引入高延遲的轉換指令。
4.系統呼叫:
引入頻繁的不必要的系統呼叫來強制上下文切換和快取/TLB 未命中。
透過採用這些技術,可以顯著悲觀給定的程式並使其運行速度比原始版本慢得多。成功去優化的關鍵是用「惡魔般的無能」而不是惡意的意圖來證明每一步的合理性。
以上是我們如何故意去優化 Intel Sandybridge CPU 的程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!