Hot Chips 28において、IntelのJack Doweck氏とWen-fu Kao氏が「Inside Skylake」と題した発表を行った。Skylakeはすでに製品が出回っており、IDFなどでも発表セッションがあり、その情報は旧聞とも言えるが、Hot Chips 28における発表は、良くまとまっており、技術的にも詳しいので、紹介する。
Skylake CPUについて発表するJack Doweck氏 |
HD Graphics GPUについて発表するWen-fu Kao氏 |
SkylakeはCPUコア、GPU、カメラ信号などを処理するISP、ディスプレイインタフェース、PCI Expressなどを集積し、その他のI/Oはチップセット経由ではあるものの、ほとんどSystem on Chipと言っても良いレベルである。Haswell/Broadwellと比べて、CPUコア、GPUコアともに強化されており、I/Oやメモリのバンド幅も向上している。
Skylakeでのメモリ系の大きな改良点は、eDRAMがLLCとDRAMの間に入り、Memory Side Cacheとなった点である。Last Level Cache(LLC)という名前とは矛盾するが、eDRAMはLLCの次のレベルのキャッシュとして機能している。
Haswell/Broadwell世代では、eDRAMは別チップで、内蔵GPUのメモリバンド幅の確保のために設けられた感があったが、この位置にeDRAMが移ったことで、CPUもGPUも使える汎用のキャッシュとなり、有用性が増している。
また、SkylakeではSoftware Guard Execution(SGX)というセキュリティ機能が追加されたが、これをサポートするため、メモリサブシステムに暗号化エンジンが追加されている。
Skylakeでは、消費電力管理でも大きな改良が加えられた。消費電力が大きな問題となるにつれて、Intelは、色々な省電力ステート(Pステート)を作って、当面、使わない部分の電力を減らす指定ができるようにしてきた。これは、電力低減には有効であるが、OSは、適切なステートになるようコントロールする必要があり、面倒である。
Skylakeでは、このPステートのコントロールは、全部、ハードウェアが自動で行うようになった。OSは最大と、最小のクロック周波数を決めておくだけで、後はハードウェアがやってくれる。
次の図は縦軸がエネルギーで横軸は性能である。この図に見られるように、処理に必要なエネルギーには最小点が存在し、これより遅いクロックで動かしてもエネルギー的には損をしてしまう。Skylakeは、このエネルギー最小状態を計算して、そのクロック周波数で動く。ただし、より高い性能を必要とする場合は、αで設定することで、電力効率は下がるがクロックを上げることができるようになっている。
そして、急に負荷が増えた場合には、次の図では6ms程度でフルターボ相当のステートに移行する。数ms待つのは、非常に短いスパイク状の負荷増加で、スイッチを起こさないようにするためである。
ブロック図のレベルでは、Skylakeコアは、前世代とあまり変わっておらず、スケジューラは8ポートのままである。しかし、それぞれのブロックの中身はエンハンスされている。
フロントエンドは、32KBのL1命令キャッシュから命令を読み、プレデコードを行って命令キューに詰め込む。それをデコードしてμOPキューに詰め込んでいる。この構成は変わっていないが、命令デコーダやμOPキャッシュのバンド幅が増加し、分岐予測テーブルの容量増加など、分岐予測機構を改良している。
SkylakeコアのOut-of-Order実行機構もほとんど変っていない。改良点として挙がっているのは、divideとSQRT命令のスループットとレーテンシの改良、AES命令のレーテンシ短縮。それに浮動小数点のADD、MUL、FMAのスループットとレーテンシをバランスさせたという点で、メリットを享受できるプログラムは比較的少ないと思われる。
Skylakeのメモリサブシステムも目新しい項目は無く、ロード、ストアのバッファキューの増加と、ロード、ストアのスループットの増加。ページにまたがるロードのペナルティの低減などの項目が並んでいる。
Skylakeでの新機能は、Intel Software Guard Extensions(Intel SGX)とIntel Memory Protection Extensions(Intel MPX)と呼ぶセキュリティ機能の追加である。Intel SGXは、アプリケーションプロセサがアクセスできないエンクレーブを作りセキュリティ関係の情報を保護するメカニズムを提供する。Intel MPXはメモリバッファのアクセスを行う前に、それが許可された範囲内のアドレスであるかどうかをチェックする。これにより、ソフトウェアの堅牢性を増すことができる。