首頁 > 後端開發 > C++ > 我們如何取消優化蒙特卡洛模擬以暴露英特爾 Sandybridge 管道瓶頸?

我們如何取消優化蒙特卡洛模擬以暴露英特爾 Sandybridge 管道瓶頸?

Linda Hamilton
發布: 2024-12-09 00:48:10
原創
432 人瀏覽過

How Can We Deoptimize a Monte Carlo Simulation to Expose Intel Sandybridge Pipeline Bottlenecks?

對Intel Sandybridge 系列CPU 中的管道進行去最佳化

此作業的目標是修改給定的程序以使其運行速度較慢,同時保持相同的演算法。這是為了更深入地了解英特爾 i7 管線的運作方式以及指令路徑如何重新排序以引入危險。

程序概述

該程序是對歐洲普通看漲期權和看跌期權進行定價的蒙特卡羅模擬。它使用 Box-Muller 演算法產生高斯隨機數並執行大量模擬來估計選擇權價格。

惡魔般的無能

目標是故意創建會減慢程式執行速度的不合格程式碼。以下是一些用「惡魔般的無能」來證明這種方法的合理性的想法:

錯誤共享

  • 創建由多個線程訪問的共享資料結​​構,但未正確同步。這可能會導致緩存行乒乓球和記憶體順序錯誤推測管道清除。

儲存轉送停頓

  • 避免使用浮點數變數的「-」運算子。相反,將高位元組與 0x80 進行異或以翻轉符號位,從而導致儲存轉發停頓。

過多的時間測量

  • 每次迭代的時間具有 CPUID/RDTSC等繁重操作的主循環,它會序列化指令並停止

不利的數學運算

  • 將常量乘法替換為倒數除法( 「為了方便閱讀」)。除法較慢且未完全流水線化。

向量化效率低

  • 使用AVX 對乘/平方運算進行向量化,但在調用之前無法使用vzeroupper標量數學庫函數,導致AVXSSE轉換

資料結構

  • 將 RNG 輸出儲存在鍊錶或亂序遍歷的陣列中。對每次迭代的結果執行相同的操作並在最後求和。這引入了指標追逐載入並破壞了快取局部性。

多執行緒誤用

  • 多執行緒程序,但強制兩個執行緒共享相同的循環計數器(具有原子增量)來建立錯誤的共享和爭用。這也引入了原子操作不必要的開銷。

其他建議

  • 引入不可預測的分支來建立錯誤預測和管道刷新。
  • 使用惡魔般無能的理由來增加循環攜帶的依賴鏈的長度。
  • 引入非連續記憶體存取模式可最大限度地減少快取利用率。
  • 額外費用學分:寫自己的平方根演算法來取代作業中提供的演算法。

修改的影響

這些修改預計會顯著透過引入管道停頓、快取未命中和其他效能瓶頸來減慢程式的執行速度。這項作業鼓勵創造力和願意探索悲觀化程式碼同時保持原始演算法的不同方法的意願。

以上是我們如何取消優化蒙特卡洛模擬以暴露英特爾 Sandybridge 管道瓶頸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板