最慢的 x86 機器碼 單一指令需 62 秒完成
【X86 Hall of Shame 🤪】當全球晶片製造商與軟體開發者均竭盡所能提升處理器效能時,一名知名硬體研究員卻反其道而行,在 GitHub 發起「x86 逆向最佳化計劃」(CPU Deoptimization) 專案,呼籲大家一起找出執行速度最慢的單一 x86 機器碼(Assembly instruction),並建立了一個「恥辱榜」(Hall of Shame)。目前最垃圾的 x86 單一指令執行時間長達 62 秒,共需要消耗超過 1,980 億個時脈週期(Clock cycles)。
據硬體研究員 Christopher Domas 表示,傳統的指令延遲分析(Instruction latency analysis)通常用於尋找效能瓶頸,協助工程師改進處理器微架構或針對特定晶片最佳化軟體運作。然而,這個「x86 逆向最佳化計劃」(CPU Deoptimization) 專案,是為了測試 x86 處理器在極端情況下的最慢執行極限。
目前,該「恥辱榜」佔據榜首的指令為「xrstor64」,該指令主要用於將單指令多資料流(SIMD)運算所需的暫存器狀態,從記憶體位置還原至 512 位元組(Byte)的區塊中。
為了達成「極致慢速」效果,Christopher Domas 採用了多重極端操作手法,自行開發了名為 mmiotic 的工具,定位出處理器內部 PCIe 匯流排(PCIe fabric)中具備高延遲特性的區域,強制 CPU 從記憶體映射 I/O(MMIO)載入這 512 位元組的狀態。光是這個步驟,就讓指令執行耗費了約 740 億個週期(折合約 23 秒)。
然後他透過另一個高延遲 MMIO 暫存器連續進行一系列 4 位元組的讀取操作,藉此充斥並癱瘓 CPU 的 PCIe 根組件(PCIe root complex)。這迫使進行中的 xrstor64 還原指令必須排在大量無意義的讀取指令之後等待,最終將執行時間推升至 1,980,02,498,236 個週期,換算時間高達 62 秒。
他表示,若未來利用 Intel Sapphire Rapids 處理器支援的 AMX 指令集實施 xrstor64,將狀態儲存區域從 512 位元組擴大至 8KB,該指令的執行時間甚至可能突破 1 兆個時脈週期,導致指令卡死更長時間。
目前該「x86 逆向最佳化計劃」排行榜已正式於 GitHub 上線,歡迎各大高手前來挑戰。為了確保實驗的公平性與純粹性,測試設有明確規範,包括測量範圍必須完全限定於單一指令的執行過程,不允許使用可被中斷(Interruptible)的指令,亦不得採計在處理程序(Handler)上執行的模擬指令,所有測量時間均根據 CPU 的基準時脈(Base clock)進行標準化換算。
由於涉及底層組合語言,此排行榜的競賽關鍵並非單純比較指令本身,而是考驗如何透過複雜的底層硬體機制運作該指令。只能說高手們的快樂往往就是這麼樸實無華且枯燥。
資料來源: