AMDは、技術発表会「HotChips」で、Zenの詳細を発表した。結果、いくつか連載370回で説明した内容で間違っているところや、新たに判明したことなどがあるのでまとめて補足しておきたい。

まずHotChipsで紹介されたZenの特徴が下の画像である。

スケジューラーやキューのサイズは、Skylakeよりもやや少ないが、Haswell/Broadwell世代とはほぼ互角といったところまで増えており、一方でキャッシュは明らかにHaswell/BroadwellはおろかSkylake世代を上回る帯域となっている。

結果、小さいプログラムやデータを扱う範囲ではSkylakeに分があるかもしれないが、大きなデータやプログラムに関してはZenに分がありそうだ。

さて、まずフェッチのところであるが、TLBがかなり強化され、さらにL0 TLBが搭載されているのがわかる。

また分岐予測にパーセプトロン(一種のニューラルネットワーク)を応用した仕組みを取り入れており、これで分岐ミスをさらに減らそうという試みのようだ。この段階では、1サイクルあたり32バイトで命令を読み込み、これをデコード段に渡す形だ。

そのデコード段であるが、Pick(32バイトのデータから命令をピックアップ)→デコード(x86命令を解釈)し、これをMicro-opキューに引き渡す格好だが、このあとマイクロコードRomを経るあたりは、やはり予想通りデコード段では最終的なMicroOpではなく、中間的な命令になると思われる。

またStack Engine Memfileと呼ばれるユニットがここに追加されているのがわかる。これは連載370回で説明したStack Engineに関係する。

もともとK10の世代で搭載されたSideband Stack OptimizerはStackの処理のみを行なうユニットである。Stack処理とは、PUSH(あるレジスタのデータをStack領域に保存)とPOP(Stack領域からデータをレジスターに復活)の2つであるが、処理的には単純なデータのMoveと、Stack Pointerという値の加減算のみで、わざわざALUを動かすのはもったいないので、Stack Pointerの加減算専用のユニット(Sideband Stack Optimizer)を用意して、こちらで処理を行なうことで省電力化を図るというものだった。

Stack Engineはこれをもう一歩すすめ、Move処理も省電力化した。ZenにはMove Eliminationという機能がある。これはRegister Fileの名前を付け替えることでデータの移動を省く仕組みだが、Stack処理の場合、従来ではメモリーに置かれたStack領域を利用するので、どうしてもメモリーアクセスが発生してしまう。

そこで、Stack専用のMemfileを32エントリー分用意し(これが上の画像に出てくるStack Engine Memfileだ)、ここにStackデータを保存することで、メモリアクセスそのものも省こうというものだ。

大規模にStackを積むと、当然32エントリーでは足りなくなるため、メモリーアクセスが発生するのは避けられないが、ちょっとしたサブルーチンコールなどではレジスターを数個Stackに保存する程度なので、ここで内部のMemfileが利用できれば省電力性と高速性の両方に役立つことになる。