概要
- Assembly Hall of Shame は、単一命令の最低パフォーマンス(最遅実行)を追求するユニークな分析プロジェクト
- fxrstor64命令 を用いたPCIe経由の高遅延MMIOアクセスが最遅記録を保持
- 各命令は、特定のハードウェア構成や状況下でどれだけ遅くできるかを競う
- ルールは「1命令のみ計測」「割り込み不可」「工場出荷時設定で実施」など厳格
- x86命令ランキング とその遅延戦略が詳細に解説
Assembly Hall of Shame 概要
- パフォーマンス最適化 ではなく、あえて「遅く実行される」命令を探求する研究プロジェクト
- 最遅命令達成のため、 PCIeファブリックのMMIO領域 やキャッシュ・バス競合などを戦略的に利用
- 計測対象は 単一命令 のみ、前後のセットアップは自由だがスコアには含めない
- Christopher Domas (@xoreaxeaxeax) によるリサーチ
ルール
- 命令1つだけ が計測対象(セットアップは自由)
- 割り込み可能な命令や、trap/エミュレーション時はtrap部分のみ計測
- rep movs, pause などは失格
- CPUベースクロック で時間正規化
- 工場出荷時設定 でのみ実施、ハードウェア改造不可
🏆 現在のチャンピオン命令(x86)
- fxrstor64 (Ryzen 7 5800H)
- 戦略: 512バイトのFPU/MMX/XMM状態をPCIe経由で高遅延MMIO領域からロード。さらに他コアでPCIeバスを飽和させ、fxrstor64のトランザクションを極限まで遅延。
- スコア: 198,002,498,236サイクル
- 時間: 62秒
名誉ある言及
- 未整列のymm0ロード によるSystem Management Modeの設計破壊(smiiiiiiiiiiiiiiii)
- vmovdqu 0xfcc003b1, %ymm0 による非整列MMIOアクセス
x86命令遅延ランキング(抜粋)
- 27位: nop
- 何もしない命令。1サイクル
- 26位: nop16
- データプレフィックスを多重付与した長いnop。20サイクル
- 25位: rdtsc
- タイマ読み出し。49サイクル
- 24位: idiv
- 128ビット除算で最長パスを通す。77サイクル
- 23位: enter
- 最大ネストでディスプレイポインタ読み込みを強制。112サイクル
- 22位: fldl
- 非正規化値でFPマイクロコードアシスト発動。133サイクル
- 21位: clflush
- キャッシュラインをL3からフラッシュ。165サイクル
- 20位: fsin
- 特殊値でマイクロコード処理。257サイクル
- 19位: mfence
- 書き込みバッファを飽和させ、全バッファフラッシュを強制。326サイクル
- 18位: mov cr3
- TLB全体無効化。352サイクル
- 17位: fadd
- 非正規化数でFPアシストを引き出す。677サイクル
- 16位: split lock
- キャッシュライン境界を跨ぐlock命令でバスロックを強制。865サイクル
- 15位: fdiv
- 非正規化除数でFPアシスト。883サイクル
- 14位: cpuid
- 高遅延CPUIDリーフを選択。1248サイクル
- 13位: rdrand
- エントロピープール枯渇後の遅延。5,579サイクル
- 12位: wrmsr
- 高遅延MSR(例: MCG_CTL)への書き込み。34,304サイクル
- 11位: out
- NICレジスタ境界を跨ぐI/Oポート書き込みでDMA停止。49,857サイクル
- 10位: rdmsr
- 未公開MSR(例: VIA 0x133)読み出し。161,602サイクル
- 9位: wbinvd
- L1/L2/L3全キャッシュのDRAM書き戻し。1,616,480サイクル
- 8位: in
- ACPI PMブロックの非整列4バイト読み出し。12,524,415サイクル
- 7位: mov
- PCIeファブリックの高遅延GPUレジスタ読み出し。443,937,696サイクル
- 6位: mov rax
- 8バイトMMIOリードで2つのdwordアクセス。887,716,864サイクル
- 5位: vmovdqu xmm
- 16バイトMMIOリードで4つのdwordアクセス。1,774,555,776サイクル
- 4位: vmovdqu ymm
- 32バイトMMIOリードで8つのdwordアクセス。3,549,079,296サイクル
- 3位: vmovdqu ymm(非整列)
- 32バイト非整列MMIOリードで9つのdwordアクセス。4,453,212,256サイクル
- 2位: fxrstor64(ベースライン)
- 512バイトのFPU/MMX/XMM状態をMMIOからロード。74,584,168,512サイクル
- 1位: fxrstor64(バス飽和)
- バス競合を最大化した状態でのfxrstor64。198,002,498,236サイクル
今後の展望・未検証命令
- xrstor64 (AMX, MMIO)
- Sapphire RapidsのAMX対応xsave領域(8KB)を用いたMMIO遅延戦略
- 理論値: 1兆サイクル超
ARM/RISC-Vランキング
- 未定義 (T.B.D.)
著者
- Christopher Domas (@xoreaxeaxeax) による研究プロジェクト
このランキングは、CPUアーキテクチャの 限界的な遅延挙動 や ハードウェア依存性 を深く観察できる貴重な資料。エンジニアや研究者にとって、通常の最適化とは逆方向の知見や、ハードウェアの設計的弱点を知る参考となる。