
研究者のChristopher Domas氏が、x86の機械語命令を1つ動かすのにどこまで長い時間をかけられるかを競う一覧「Assembly Hall of Shame」をGitHubで公開した。命令ごとにかかる時間を測る解析は、普通は処理を速くするために使う。狙いはその逆で、単一の命令で到達できる遅さの底を探す。首位はfxrstor64という命令で、1回の実行に1980億2498万2236サイクル、時間にして62秒かかった。
一覧は27項目で構成する。最下位、つまり最も速いのは何もしないnop命令で1サイクル、時間は0ナノ秒にとどまる。基準として置いたrdtscが49サイクル、除算のidivが77サイクルと続く。ここまでは通常の感覚に近い。ところが順位が上がるにつれて桁が跳ね、乱数を生成するrdrandが5579サイクル、キャッシュの内容をメモリーへ書き戻すwbinvdが161万6480サイクル、周辺機器のI/Oポートを読むin命令が1252万4415サイクルになる。首位のfxrstor64は、nopの約2000億倍のサイクルを1命令に費やしている。
首位を取った手口はメモリーの外側にある。fxrstor64は、SIMD演算に使うレジスターの状態512バイトをメモリーから読み戻す命令だ。Domas氏はこの読み出し先を、通常のメモリーではなくMMIOに向けた。MMIOはCPUから見るとメモリーのように見えるが、実体は拡張カードなど周辺機器のレジスターにつながる領域を指す。同氏は自作ツールのmmioticでPCIeの経路のうち応答が特に遅い場所を探し、そこから512バイトを読ませた。これだけで745億8416万8512サイクル、23.35秒に達する。さらに他のCPUコアから別の低速レジスターへ4バイトの読み出しを連打してPCIeの入り口を渋滞させ、待ち行列の後ろに並ばせた結果が62秒になる。
競技のルールも定めてある。計測できるのは1命令だけで、そこへ至る準備の処理はいくら書いてもよい。トラップやエミュレーションが挟まる命令は、トラップまでしか計測を認めない。rep movsやpauseのように途中で中断できる命令は失格になる。時間はCPUのベースクロックで正規化し、ハードウェアの改造も禁じる。記録に使ったのはAMD Ryzen 7 5800Hを積んだ小型PCで、工場出荷の構成のままだ。
Domas氏は次の標的として、IntelのSapphire Rapidsが備えるAMX向けのxrstor64を挙げる。読み戻す状態領域が512バイトから8KBへ16倍に増えるため、1兆サイクルに届くと見込む。ARMとRISC-Vの一覧は未着手になっている。ソースコードと各項目の再現手順はMITライセンスで公開されている。

