コアは2命令並列のOut-of-Order+2個の512bit VPU
KNLのコアは2命令並列のデコード、リネーム、リタイアを行うOut-of-Order(O-o-O)実行コアであり、4スレッドを並列に実行することができる。2命令のO-o-Oという比較的簡素な設計であるが、4スレッドをSMTで実行することでデータ依存による実行制約を減らすという上手いチョイスとなっている。
D-Cacheは32KB 8Wayであり、512bitのデータの2つの読み出しと、1つの書き込みを同時に行えるようになっている。演算器は512bit幅のベクトルALUを2組装備している。
各コアは4スレッドを並列に実行するSMT(Simultaneous Multi-Threading)方式であり、ROB(ReOrder Buffer)、リネームバッファ、RS(Reservation Station)はダイナミックにスレッドごとにエントリを分割して使用される。一方、キャッシュやTLBはすべてのスレッドが共有することになる。このため、1スレッドしか実行していない場合でも、実行中のスレッドが全部の資源を使うことができる。
次のブロック図で★のついている部分はスレッドを選択している部分を示す。その他の部分はその命令がどのスレッドに属するかを意識することなく処理を行っている。
KNLはHaswellと命令互換
KNLはAVX2命令を含み、Haswell CPUと同じ命令を実行することができるが、唯一の例外はトランザクショナルメモリを実現するTSX命令で、これはサポートしてない。KNLでTSX命令を必要とするトランザクション処理を実行することは、Intelとしては想定していないようである。
そして、KNLでは512bit長のベクトルデータをマスク付きで演算するAVX-512命令がサポートされている。AVX-512命令の中には、通常の演算以外に、指数関数や逆数を計算するAVX-512ER命令や、ベクトルのプリフェッチを行うAVX-512PF命令などが含まれている。
配列を扱うループでは、ある回のループの演算結果を後の回のループが入力として使うような計算が含まれていることがある。しかし、後の回の入力データを前の回の演算結果の格納する以前に読んでしまうようなベクトル化が行われると、正しい結果が得られなくなってしまう。KNLでは、このような問題を生じる可能性があるデータ参照を検出するAVX-512CD(Conflict Detection)という命令があり、その部分をマスクして問題の無い部分だけを効率的にベクトル化することができるようになっている。
高バンド幅のMCDRAMを同一パッケージに搭載
KNLでは、MCDRAMという3D積層の高バンド幅のメモリをプロセサチップと同一のパッケージに搭載してメモリバンド幅を大きく引き上げている。そして、最大384GBのDDR4 DIMMと16GBのMCDRAMがプロセサチップに接続されることになるが、その使い方には、次の図のような3つの形態がある。
その第1は、MCDRAMをDDR DRAMのキャッシュとして使うという方法である。MCDRAMのキャッシュのヒット率が高ければ、全部が高バンド幅のメモリのように使える。第2の方法は、MCDRAMとDDR DRAMを別アドレスのメモリとして使うという方法である。この場合は、変数をMCDRAMの領域に置けば高バンド幅、高バンド幅を必要としないデータはDDR DRAMの領域に置くというソフトウェアによる最適化ができる。
第3の方法は、MCDRAMの一部をキャッシュとして使い、残りはDDR DRAMとは別のアドレスに置くというハイブリッド方式の使い方である。アクセス頻度が高く、常に高バンド幅が必要なデータはMCDRAM側のアドレスに置き、その他のデータはDDRメモリのアドレスに置いてMCDRAMのキャッシュ効果を利用するという方法で、Intelとしては、この使い方が多く使われると見ている。
(次回は9月8日に掲載します)