世界を動かす技術を、日本語で。

恥の集会所

2026年8月8日原文(github.com)

概要

  • 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アーキテクチャの 限界的な遅延挙動ハードウェア依存性 を深く観察できる貴重な資料。エンジニアや研究者にとって、通常の最適化とは逆方向の知見や、ハードウェアの設計的弱点を知る参考となる。

Hackerたちの意見

この作者は、mov 命令だけを出力するコンパイラや、制御フローをわざと混乱させるコンパイラも持ってるんだって。デバッガで逆アセンブルすると、骸骨や脅威みたいなシンボルが表示されるらしいよ。

彼は全てのオペコード空間をブルートフォースで攻撃して、文書化されてない命令を見つけたんだ(サンドシフター)。

コンピュータが数年ごとに明らかに遅く感じるのはおかしいよね。1ミリ秒でどれだけの命令が実行できるか考えると、恥ずかしいくらいだよ… プログラマーが抽象化に無駄に計算資源を使うっていう法律、なんて言ったっけ?

え? 1ミリ秒って永遠だよ!

新しいWindowsのメモ帳は恥ずかしいよね。

ウィルスの法則だと思う。

OSはもっと少なくするべきだよ、増やすんじゃなくて。

アンディとビルの法則。

このグラフから見ると、全てに nop 命令を使うべきだね。

まあ、最高のコードはコードがないことだよね。でも、nopは二番目に良いかも。

nopが一番であるべきだよ。だって、やってることに対して無限に遅いからね。 ;)

RIPが1増えるんだね。

Hacker Newsで議論の続きを見る