Sideband Stack Optimizer(Photo04)
これが何か? といえば、かつてPentium Mで搭載されたDedicated Stack Managerと同種のもの。要するにレジスタのスタック退避に伴う、
- レジスタの内容をスタックポインタの位置に格納
- スタックポインタのインクリメント
あるいはレジスタの復帰に伴い、
- スタックポインタの位置の内容をレジスタに格納
- スタックポインタのデクリメント
という作業を、ALU/AGUを使わずに専用ユニットで行う、という話である。
こちらは論より証拠ということで、かつてこちらで利用したUtil11(プログラムとソースはこちら:Util11.zip)をそのまま動かしてみた。ちなみにプログラムは「最適化無し」の方である。
結果はグラフ17の通り。間違いなく高速化出来ていることが確認できた。むしろ今まで搭載されていなかったことが不思議という感もあるのだが、これはAMDのささやかな誤算なのではないか、と筆者は考える。
そもそもこうしたStack操作が、x86の性能が上がりにくい理由の一つであるというのは、以前も指摘した事がある。これは要するに汎用レジスタが少なすぎて、煩雑にPUSH/POPを繰り返す必要があった8086時代の名残であり、そのためにAMD64では64bitモードで汎用レジスタが大幅に増え、これによりPUSH/POPの必要性が大幅に薄れる「筈だった」。こうした見積もりもあって、K8にはStack処理専用ユニットを搭載しなかったのではないかと思う。
ところが実際はというと、なかなか64bitへの移行が進まず、またコンパイラの最適化もまちまちで、64bitモードにも関わらずPUSH/POPを多用するコードを吐くものまである始末。かつて、Pentium Proで16bitの最適化があまり行われておらず、Windows 9xを動かすとPentiumより遅いなんて騒ぎがあったが、(あれほど問題はシビアになってないものの)同種の見積もり違いがAMDにあったのではないか、と筆者は想像する。今回Sideband Stack Optimizerが搭載されたのは、こうした誤算に対するAMDの対策ということではないかと思う。