後藤弘茂のWeekly海外ニュース

第3世代Ryzen Threadripperを支えるダイ間の接続技術

Zenの3種類のファブリック

第3世代Threadripper

 AMDは、32コアの7nm世代のRyzen Threadripperと64コア版の投入も発表した。7nmプロセスでは、CPUコアコンプレックスを搭載した「CCD(Core Complex Die)」チップレットダイと、I/Oとメモリインターフェイスを搭載した「IOD(I/O Die)」に分離されたマルチダイアーキテクチャを取っている。

 7nm Threadripperも、32コアでは4個のCCDと、1個のIODで構成される。AMDのZenの最大の特徴は、このスケーラブルなマルチダイアーキテクチャであり、そのアーキテクチャのカギとなるのは、ダイ間ファブリックだ。AMDは、7nmのEPYC/Threadripperでは、非対称のファブリック構成を取る新しいアプローチを導入した。

 Zenアーキテクチャでは、ダイの間は「GMI (Global Memory Interconnect)」または「IFOP (Infinity Fabric On-Package)」と呼ばれるインターコネクトで接続される。

 AMD内部で開発段階で使っていた名称がGMI、学会発表時につけた名称がIFOPであるため、名前が2種類ある。AMD内部でも、学会で発表するときはIFOPと呼ぶが、アーキテクトはGMIと呼ぶ。しかし、実際にはまったく同じものを指している。

 ちなみに、パッケージ同士を接続するインターコネクトも「IFIS (Infinity Fabric Inter-Socket)」と、「xGMI (Inter-Chip Global Memory Interconnect)」の2種類の名称がある。こちらも、IFISとxGMIは基本的に同じものだ。

 AMDは現在のインターコネクト群に「Infinity Fabric」という名称を冠している。Infinity Fabricは、実際にはデータ伝送の「Infinity Scalable Data Fabric(SDF)」と、制御系の信号伝達の「Infinity Scalable Control Fabric(SCF)」の、まったく異なる2系統を統合する名称となっている。

 データ伝送のインターコネクトについては、Infinity Fabricは、旧来のAMDのインターコネクト「Coherent HyperTransport」のプロトコルを拡張したものとなっている。

 コヒーレンシプロトコルは7ステイトの「MDOEFSI」であることが明かされている。この“D”と“O”がなにを示すかは明らかにされていないが、標準的なMESI(Modified/Exclusive/Shared/Invalid)より複雑なプロトコルであることは確実だ。Zen 2世代でも、プロトコル部分は、基本は変わっていないと見られる。

 同じInfinity Fabricプロトコルを使っていても、使われている場所によって各インターコネクトの物理的な実装は大きく異なる。AMDアーキテクチャのデータ伝送のファブリックは分類すると、オンダイ(On-Die)のInfinity Scalable Data Fabric(ISDF)と、ダイ間のIFOP(GMI)、ソケット間のIFIS(xGMI)の3種類となる。プロトコルは共通だが、物理的にはまったく異なるファブリックとなる。

 オンダイのISDFでは配線幅はほとんど問題とならないため128/256-bitの幅広インターフェイスのままだ。それに対してダイ間のIFOP(GMI)は、シングルエンド(single-ended)信号で、1リンクのデータレーンは片方向32-bit幅を基本とする。一方、パッケージ間のIFIS(xGMI)はディファレンシャル(Differential)信号で、1リンクは片方向16-bit幅となる。

 Zen 2世代でも、この基本は変わっていない。ちなみに、14nm SOCのZeppelinでは、IFIS(xGMI)はPCI ExpressやSATAとPHYを共有している。7nmのZen 2系のサーバー向けI/Oダイ「sIOD(Server I/O Die)」では、加えてPCI Express Gen4とCCIXの共有PHYとなっていると見られる。

AMDのIFOP(GMI)ファブリック

内部ファブリックのクロックと同期するIFOP(GMI)

 AMDによると、Zen 2アーキテクチャのEPYC/Threadripperでも、IFOP(GMI)の伝送方式自体は、Zen/Zen+世代とほぼ類似のものだという。

 しかし、Zen 2のEPYC/Threadripperでは、転送レートが若干上がり、さらにCPUに対してはリードがライトに対して2倍の帯域の非対称となった。インターコネクト帯域はCPUダイであるCCDへのリードが52.6GB/s、ライトが26.3GB/sとAMDは説明する。

 ただし、このIFOP(GMI)インターコネクト帯域はファブリッククロック(FCLK)によってスケールするため、一定ではないという。EPYC発表時の説明では、7nm EPYCのIFOP(GMI)帯域は、リードが32-byte(256-bit)/FCLK、ライトが16-byte(128-bit)/FCLKとされている。

 7nm版Threadripperの構成も、同様と見られる。リードが52.6GB/secで、ファブリッククロック当たり32-byteなら、1.66GHzとなる。AMDの説明する第3世代ThreadripperのIFOP(GMI)帯域の値はFCLKが1.66GHz時であることがわかる。

 ちなみに、AMDの現在のCPUは、複数のクロックドメインに分割されている。CPUコアそれぞれのクロック「CCLK」、L3キャッシュのクロック「L3CLK」、データファブリックのクロック「FCLK」、ユニファイドメモリコントローラのクロック「UCLK」、メモリインターフェイスのクロック「MEMCLK」、I/Oクロック「ICLK」にドメインが分かれている。

 メモリのMEMCLKとUCLKはDDR4の転送レートに合わせており(転送レートが2,667Mbpsの場合は1.33GHz)、ファブリックのFCLKも基本はDRAM転送レート、L3のL3CLKはCCXで共通、CPUコアのCCLKはコアごとに独立、I/OのICLKはFCLKの2分の1となっている。

 もともとAMDアーキテクチャでは、内部ファブリックはMEMCLKで動作していたが、分離されるようになった。しかし、この2つのクロックは同期するのが基本だ。

14nm Zen+系の内部のクロックと帯域

 IFOP(GMI)は、これらのクロックのなかでFCLKと同期する。そのため、IFOP(GMI)は転送帯域自体より、FCLKに対する転送レートで示すほうが適切となる。14nmプロセスでは、IFOP(GMI)リンクは内部ファブリックSDFとの間で、1クロックに16-byte(128-bit)のデータを送受信する仕様となっていた。

 そして、IFOP(GMI)の伝送路では、FCLK1クロック当たり4転送を行なっている。言い換えれば、IFOP(GMI)のレーン当たりの転送レートはFCLKの4倍となる。

 DDR4インターフェイスの転送レートが3,200Mbpsで、内部ファブリックが1.6GHz FCLKで動作する場合、IFOP(GMI)は6.4Gbpsの転送レートで動作する。IFOP(GMI)はクロックをエンベデッドしないため、6.4Gbpsの転送レートで1チャネル分のDRAM帯域にマッチする。ここがミソで、2チャネル分のDRAM帯域とマッチさせるためには、IFOP(GMI)は2リンクを必要とする。

CPUによって異なるIFOP(GMI)の構成

 AMDのマルチダイZen製品では、IFOP(GMI)の構成はそれぞれ異なっている。大きく分けて3種類。リードとライトがともに片方向32-byte(256-bit)/FCLKの構成、リードとライトがともに16-byte(128-bit)/FCLKの構成、そして、7nmのEPYC/Threadripperの、リードが32-byte(256-bit)/FCLKでライトが16-byte(128-bit)/FCLKの非対称の組み合わせだ。

 14nm世代では、リードとライトのリンク数がマッチしていたが、7nmではEPYC/Threadripperで非対称となっている。

 AMDによると、Zen 2に実装されているIFOP(GMI)は、“リード/ライトスプリット(Read/Write split)”アーキテクチャとなっているという。通常は、リードのレシーバ(RX : Receiver)とライトのトランスミッタ(TX : Transmitter)が1対1のセットで構成されている。しかし、Zen 2では、リードRXとライトTXは分離されており、RXとTXの構成は変更可能であるとAMDは説明する。

 IFOP(GMI)のベース技術を考えると、片方向32-byte(256-bit)/FCLKの場合も、物理的にx64のレーン構成であるとは考えにくい。32-byte(256-bit)/FCLKのケースでは、x32 RXが2リンクとなっていると見られる。実際、14nm世代では、32-byte(256-bit)/FCLKの実態は、2つのx32 IFOP(GMI)リンクとなっている。

 具体的にはどういった構成になっているのか。14nmプロセスでは、IFOP(GMI)はx32のレシーバ(RX : Receiver)と、x32のトランスミッタ(TX : Transmitter)のペアで構成されていた。4個のダイを相互接続する14nmのEPYCや32コアのThreadripperでは、各ダイの間はx32のTXとRXのペアの1リンクで接続されていた。データ転送は、片方向につき16-byte(128-bit)/FCLKとなる。リードとライトは同じ構成で、帯域も同じだ。

 一方、最初の2ダイ有効の16コアまでのThreadripper Xでは、ダイ間のIFOP(GMI)は2リンクを使っていた。x32のリンクが2つで、片方向につきx64分のインターコネクトとなり、片方向32-byte(256-bit)/FCLKの転送レートとなる。

 これは、2チャネルのDRAMのフルの読み出し帯域と一致する。ちなみに、14nmのRyzenはシングルダイなので、CPUコアとDRAMの間にIFOP(GMI)によるコネクションがない。CPUコアとDRAMは、オンダイで32-byte(256-bit)/FCLKで結ばれている。

14nm世代のIFOP(GMI)の構成

CPUからDRAMへのアクセスに必ずIFOP(GMI)がはさまる7nm Zen CPU

 7nmでは、CPU版のRyzenとEPYC/Threadripperでは、すべてCPUダイが、I/Oとは別ダイのチップレットとなっている。つまり、CPUからDRAMまでの間に、ダイ間インターコネクトが必ず挟まる。IFOP(GMI2)がインターコネクトとして使われている。

 クライアントでは、1個または2個の「CCD」を、1個のクライアント向けI/Oダイ「cIOD(Client I/O Die)」に、IFOP(GMI2)で接続する。

 Zen 2世代のクライアントCPU版Ryzenでは、GMI2経由の転送は1クロック当たり32-byte(256-bit)とされている。このクロックはFCLKと見られるため、32-byte(256-bit)/FCLKとなる。

 Zen 2のGMI2の伝送技術は、Zen/Zen+のGMIの延長にあるため、Ryzen系ではGMI2で、2リンク分のTX/RXペア使っていることがわかる。合計で片方向がx32の送受信が、2セットでx64相当の伝送となる。また、このことから、CCDには2リンク分のIFOP(GMI)が実装されていることがわかる。

7nm世代のIFOP(GMI2)の構成

 7nmのEPYCとThreadripperでは、CPUダイであるCCDと、サーバー向けI/OダイであるsIODの間はリードとライトが非対称となっている。CPUへのリードは32-byte(256-bit)/FCLKだが、CPUからメモリ/I/Oへのライトは16-byte(128-bit)/FCLKだ。

 これは、いわば妥協のコンフィギュレーションだ。7nmプロセスZen 2のアーキテクチャでは、CPUコアとDRAM間のリード帯域を32-byte(256-bit)/FCLKに確保しながらも、パッケージングの複雑度や電力などを抑えなければならない。結果として非対称な構成になったと推測される。

32Byte/サイクルを保つRyzenでのCPU-DRAM帯域

 なぜ、7nmのZen 2アーキテクチャでは、IODからCCDへのリードを32-byte(256-bit)/FCLKにしなければならないのか。それは、14nmプロセスのZenと同等のDRAMアクセス帯域を維持しようとするなら、32-byte(256-bit)/FCLKのIFOP(GMI)構成にしなければならないからだ。14nm Zenと比較すると、よくわかる。

 14nmのZen CPUダイ「Zeppelin」では、2チャネルのDDR4メモリインターフェイスが「Unified Memory Controller(UMC)」経由で、内部バス「Scalable Data Fabric(SDF)」に32-byte(256-bit)/FCLKで接続されている。SDFからCPUクラスタである「CCX(Core Complex)」へは、これも32-byte(256-bit)/FCLKで接続されている。2チャネルのDRAMがCPUコアまで、オンダイで32-byte(256-bit)/FCLKの帯域で接続されていた。

 クライアントのRyzenのDRAMアクセスを、14nmと7nmで比較すると下の図のようになる。7nmのZen 2では、I/OおよびメモリからCPUコアクラスタCCXまでの接続が、ダイ間インターコネクトのIFOP(GMI2)を経由する。1リンクのIFOP(GMI2)は、16-byte(128-bit)/FCLK。

 メモリへのアクセスはオンダイで済んでいた14nmのZenと同等のDRAM→CPUコアのフル帯域を得るためには、ダイ間インターコネクトを32-byte(256-bit)/FCLKにしなければならない。

 シングルスレッド性能が重要なクライアントでは、これは非常に重要な問題だ。そのため、Zen 2クライアントでは、CCDとcIODの間は、双方向2リンクのIFOP(GMI2)で接続されていると見られる。

RyzenにおけるDRAMアクセスの違い

 このことは、クライアント用のI/Oダイである「cIOD」には、4リンク分のIFOP(GMI2)ペアが実装されていることを示している。cIODは、2個までのCCDを接続できるためで、言い換えれば、4個のTXと4個のRXを備えると考えられる。

世代で大きく変わるThreadripperのファブリック構成

 14nmの16コア版Threadripper Xでは、2ダイ構成で、Ryzenと同じZeppelinダイなので、それぞれのダイにCPUコアコンプレックスのCCXとDRAMインターフェイスがある。

 CCXは同じダイ上のDRAMインターフェイスへはオンダイのSDFによって32-byte(256-bit)/FCLKで接続されていた。そして、ダイ間も、2リンクのIFOP(GMI)ペアを使っていたため、ダイ間のリード/ライトが32-byte(256-bit)/FCLK。

 つまり、もう1つのダイに接続されたDRAMに対しても、32-byte(256-bit)/FCLKのフル帯域で接続されており、DRAM帯域のままリード/ライトができた。

14nm 16コアThreadripperのダイアグラム
14nmプロセスのThreadripperの構成の違い
ThreadripperのDRAMアクセス

 同じ14nmのThreadripperでも、次の世代の32コア版になると、DRAMアクセスの帯域が変わって来る。32コア版では、4ダイを接続するため、ダイ同士の間は1リンクのIFOP(GMI)になり、その間は16-byte(128-bit)/FCLKの転送となった。

 また、DRAMインターフェイスが有効になっているのは2ダイのみで、残りの2ダイはDRAMインターフェイスが無効になっているコンピュートダイとなった。

 そのため、DRAMの接続されたI/Oダイはオンダイで32-byte(256-bit)/FCLKのDRAMアクセスが可能だが、コンピュートダイは16-byte(128-bit)/FCLKのDRAMアクセスとなった。

 構成としては、バランスが悪いものだが、少なくとも半分のCPUコアは、オンダイで32-byte(256-bit)/FCLKのDRAMアクセスが可能だ。

16コアの初代Threadripper
32コアの第2世代Threadripper

 7nmのThreadripperは、最初の16コアThreadripper Xと同様に、すべてのCPUコアコンプレックスからDRAMに対して32-byte(256-bit)/FCLKのリードが可能になった。CPUコアが、2チャネルのDRAMインターフェイスにマッチするリード帯域で、I/Oダイと接続されている。

 もちろん、本来的には、CCDとsIODを、2リンクペアのIFOP(GMI2)で接続して、リードとライトともに32-byte(256-bit)/FCLKにすればいい。

 しかし、AMDはそうはせず、リードだけを32-byte(256-bit)/FCLKにして、ライトは半分の16-byte(128-bit)/FCLKに留めた。これは、CPUへのデータのリードのほうがライトより頻度が高いためだ。

 AMDによると、リードとライトではほぼ4対1程度の比率だという。そのため、7nm世代のZen 2でサーバーとクリエイティブワークロードのEPYC/Threadripperでは、リードのほうが帯域が広い非対称のダイ間インターコネクトとなっている。

リード帯域が上がったEPYCでのIFOP(GMI)構成

 ダイ間インターコネクトの帯域をEPYCで比較すると下の図のようになる。14nmでは、同じダイに載っているDRAMインターフェイスに対してのみCCXは32-byte(256-bit)/FCLKアクセスができる。ほかのダイに接続されたDRAMに対しては、いずれも1リンクのIFOP(GMI)による16-byte(128-bit)/FCLKのアクセスとなる。

 サーバーの場合は、ワークロードとして多くのCPUコアがビジーになるので、これでも問題にはならない。

 しかし、7nmのEPYCでは、7nm Threadripperと同様に、DRAMからCCXまでのメモリリードは32-byte(256-bit)/FCLKと2チャネルのDRAMのフル帯域にマッチしており、より優れた構成となっている。もちろん、I/Oダイの内部ファブリックがフルのスイッチ性能を発揮できれば、という条件はつくが。

サーバー向けEPYCでのDRAMアクセス

 なぜ、AMDはEPYC/Threadripperで、非対称のインターコネクト構成を取ったのか。

 想定される理由の1つはパッケージングの複雑度を下げることだ。Zenのマルチダイは配線地獄で、パッケージの配線は非常に複雑だ。32コアのThreadripperで比較すると、14nmと7nmでは、IFOP(GMI)の配線数は同等になる。

 14nmプロセスのThreadripperのIFOP(GMI)は片方向x32が6ペアで、x32レーンが12となる。それに対して、7nmプロセスのThreadripperのIFOP(GMI2)は片方向x32が2+1の組み合わせが4つで、x32レーンが12となる。

 ファブリックの消費電力も問題だ。ただし、IFOP(GMI)は省電力機能を充実されている上に、パッケージ上の配線はZenアーキテクチャよりZen 2アーキテクチャのほうが容易になっている。Zen 2世代のほうが配線長が短く、電力もその分抑えられる。

 IFOP(GMI)は、AMDのマルチダイアーキテクチャの成否を握る鍵となる技術だ。そのため、AMDはここにフォーカスしている。電力とレイテンシの低減がポイントで、14nmと比べて、レイテンシについてはアーキテクチャの改良で低減され、ファブリックのトータル電力も低減されている。