
2026/08/08 3:01
屈辱の集会所
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
「恥辱の議場」プロジェクト(クリスチャン・ドマスの主導)は、速度最適化ではなく単一指令の絶対的なフローア(最小値)を記録することを目的としています。最も高速に計測された指令はインテル Core i7 での
nop(1 サイクル)ですが、極端な遅延は vmovdqu ymm 命令(約 1.39 秒)や AMD Ryzen チップ上の wrmsr 命令(約 0.92 秒)に見られます。勝者の高遅延戦略には、GPU レジスタへのアクセスのために PCIe ファブリックを飽和させるなどの複雑な回避策や、微コードアシストをトリガーするために NaN などの特殊値の使用が含まれます。注目されるエントリーには、仕様違反の非対齐読み込み命令やネスト深さ最大級の enter 命令があります。この競技は厳格な規則に従っており、ファクトリーストックのハードウェア上で単一かつ割り込み不能な指令の実行を要求します。将来のプロジェクトでは、インテル Sapphire Rapids でさらなる長遅延(推定で 1 トリリオンサイクル)を探る可能性がありますが、ARM と RISC-V のリーダーボードは引き続き観測中です。これらの発見は深層アーキテクチャ的不効率を明らかにし、開発者が理論的な性能限界と、ハードウェアの欠陥や微コード振る舞いによる実際の物理的遅延を区別するのに役立ちます。本文
アセッムブリ・シャーム殿堂(Assembly Hall of Shame)
📖 概要
アセッムブリ・シャーム殿堂は、通常のパフォーマンス最適化とは逆のアプローチを採用したプロジェクトです。単一指令の実行速度を最大限に遅くし、**絶対的な底値(フロア)**を探求しています。
- 目的: コード実行速度の最小化(スロー化)
- 対象: 単一の x86 アセンブリ指令
🏆 現チャンピオン:fxrstor64
現在、殿堂の最高位を占めるのはx86 アーキテクチャ上の
fxrstor64 指令です。
- 使用 CPU: AMD Ryzen 7 5800H
- 戦略: 「飢餓戦術」による PCIe ファブリックの飽和化
- CPU 0 は、PCIe ファブリック内の高遅延 MMIO レジスタから FPU/MMX/XMM ステートを読み取る
を実行する。fxrstor64 - 読み込みが進行中(in flight)の間、ファブリックを「飢えさせる(starve)」状態にする。
- CPU 1〜N(ハンマーコア隊)は、別の高遅延 MMIO レジスタへの緊密な 4 バイトリードを実行し、PCIe ルートコンプレックスとエンドポイントを未提出(non-posted)トランザクションで飽和させる。
- これにより、CPU 0 の実行待ち行列はこれらの争用トラフィックの後ろに並ばざるを得なくなる。
- CPU 0 は、PCIe ファブリック内の高遅延 MMIO レジスタから FPU/MMX/XMM ステートを読み取る
🚀 スコア詳細
- サイクル数:
クロックサイクル198,002,498,236 - 所要時間:
62 秒
💻 コード例 (AMD Ryzen 7 5800H)
; CPU 0 — 計時対象の指令(スロー化) movl $0xfcc68830, %rsi fxrstor64 %rsi ; CPU 1..N — ハンマー攻撃ループ(PCIe 飽和化) movl 0xfcc68858, %eax
🥈 名誉あるメンション:SMM 破壊
システム・マネジメント・モード(SMM)の根本的な設計を破壊した事例として、以下の非整合アドレスロード指令が採用されました。
- 手法: stalled GPU レジスタからの未提出ワードアクセスを強制
- 記述:
(実装依存のメモリアクセス)smiiiiiiiiiiiiiiii - コード:
vmovdqu 0xfcc003b1, %ymm0
⚖️ ルール規定
スコアリング対象は単一の指令のみです。以下の条件が必須です。
- セッティング: 準備作業にどのような設定を用いても構いません。
- 計測対象:
- トラップ・エミュレート・仮想化される指令は、処理ハンドラの実行時間を計測してはなりません。
- 許可されるのは「トラップ発生の時間」のみです。
- 中断禁止: 指令は中断可能であってはなりません。
プレフィックスやrep
などを使用すると不合格となります。pause
- 正規化: 時間は CPU のベースクロック周波数に基づいて正規化されます。
- ハードウェア制限: すべてのプラットフォームは**ファクトリ・ストック(出荷時設定)**でなければなりません。ハードウェアの改修は不可です。
📊 x86 リーダーボードトップ 30
| ランク | 指令名 | スコア (サイクル) | 所要時間 |
|---|---|---|---|
| 30 | | 1 | 0 ns |
| 29 | | 20 | 7 ns |
| 28 | | 49 | 18 ns |
| 27 | | 77 | 28 ns |
| 26 | | 112 | 41 ns |
| 25 | | 133 | 49 ns |
| 24 | | 165 | 60 ns |
| 23 | | 257 | 94 ns |
| 22 | | 326 | 120 ns |
| 21 | | 352 | 110 ns |
| 20 | | 677 | 249 ns |
| 19 | | 865 | 319 ns |
| 18 | | 883 | 325 ns |
| 17 | | 1,248 | 460 ns |
| 16 | | 5,579 | 2.057 µs |
| 15 | | 34,304 | 10.742 µs |
| 14 | | 49,857 | 15.580 µs |
| 13 | (VIA) | 161,602 | 202.004 µs |
| 12 | | 1,616,480 | 506.165 µs |
| 11 | | 12,524,415 | 3.921769 ms |
| 10 | (PCIe deadspace) | 443,937,696 | 139.010268 ms |
| 9 | (MMIO read x2) | 887,716,864 | 277.971228 ms |
| 8 | (MMIO x4) | 1,774,555,776 | 555.664133 ms |
| 7 | (MMIO x8) | 3,549,079,296 | 1.111345034 s |
| 6 | (unaligned) | 4,453,212,256 | 1.394428818 s |
| 5 | (基準値) | 74,584,168,512 | 23.354502677 s |
| 4 | 🏆 fxrstor64 🏆 | 198,002,498,236 | 62 秒 |
※注:ランクは元のデータに基づき整理しました。トップ挑戦者は
の拡張戦略で記録されたスコアです。fxrstor64
🧐 トップ挑戦者詳細と戦略解説
🥇 1 位:fxrstor64 (拡張遅延戦略)
- CPU: AMD Ryzen 7 5800H (Trigkey S5)
- 戦略: PCIe ルートコンプレックス飽和化による「飢餓戦術」の実施。
🥈 27 位:nop
- 概要: 何もしません。リーダーボードの基準となる最小実行時間です。
- 挑戦者: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
🥉 26 位:nop16
- 概要: 通常の
では短すぎたため、nop
プレフィックスを反復使用して延長しました。data16 - コード:
data16 data16 data16 data16 data16 data16 data16 nopl 0x00000000(%%eax,%%eax,1)
🧮 24 位:idiv
- 概要: 128 ビットの除数を使用し、商を符号拡張の上限値以上に押し上げることで時間を稼ぎます。
- コード:
xorq %rax, %rax ; rax = 0 (除数の低 64 ビット) movq $2, %rdx ; rdx = 2 (除数の高 64 ビット:実際の除数 = 2^65) movq $5, %rbx ; 除数 → 商 = 2^65/5 ≈ 7.4×10^18 idivq %rbx
📂 23 位:enter
- 概要: ネストの最大深さ(31)を使用して、ディスプレイポインタのロードとプッシュを 30 回強要します。
- コード:
enter $0, $31 ; アロケートサイズ 0 バイト、ネスト深さ 31 (最大値)
🌊 22 位:fldl
- 概要: 小さい正規化外の数値(denormal)を使用して、FP マイクロコードアシストをトリガーします。
- コード:
movabsq $0x0000000000000001, %rax movq %rax, -8(%rsp) fldl -8(%rsp)
➕ 20 位:fadd
- 概要: 正規化外のソースオペランドを使用して、x87 FP マイクロコードアシストパスに到達します。
- コード:
fldl subnorm ; 1e-310: 値 < DBL_MIN, バイアスエキスポネント = 0 faddl subnorm ; ソースが正規化外 → FP マイクロコードアシストが発生
🛡️ 15 位:wrmsr
- 概要: Zen アーキテクチャで
を使用。MCA エラーバンク間のクイーズ/同期を必要とするファブリックレベルの通信を行います。MCG_CTL - コード:
movl $0x17b, %ecx ; MCG_CTL wrmsr
💾 9 位:wbinvd
- 概要: L1/L2/L3 キャッシュ全体にダッティライン(書き込み待機ライン)で完全に埋め尽くし、階層全体の DRAM への書き戻しを強制します。
🔄 7 位:mov (PCIe deadspace)
- 概要: PCIe ファブリック内の高遅延デッドスペースを特定するために
を使用し、不明な GPU レジスタにアクセスします。mmiotic
📦 5 位:vmovdqu xmm (MMIO x4)
- 概要: MMIO スペース内で最も遅いレジスタを検索し、16 バイトの MMIO リード(4 ドワードアクセス)を使用します。
- コード:
vmovdqu 0xfcc003b0, %xmm0
🚀 4 位:vmovdqu ymm (MMIO x8) / unaligned
- 概要: MMIO スペース内で最も遅いレジスタを検索し、より大きなデータ転送または不整合アドレスを使用して時間を稼ぎます。
📝 その他のアーキテクチャ
- ARM リーダーボード: 未定(T.B.D.)
- RISC-V リーダーボード: 未定(T.B.D.)
👤 著者情報
本プロジェクト「アセッムブリ・シャーム殿堂」は、Christopher Domas (@xoreaxeaxeax) 氏による研究プロジェクトです。