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

2系統に分かれた第2世代Threadripperのアーキテクチャ

XとWXの2系統でアーキテクチャが異なるThreadripper

 AMDが最大32コア/64スレッドまでの「2nd Gen Ryzen Threadripper」を発売した。第2世代のThreadripperは、アーキテクチャ的には2系統に分かれる。16コアと12コアの「X Series」、32コアと24コアの「WX Series」だ。従来のThreadripperは16コアまでで、WXシリーズは、従来2倍の32コアとなる。どちらも、同じSocketTR4で、同じマザーボードを使うことができる。

 AMDのCPU製品は、すべて同一のベースダイを使っている。ZEN世代の最初のCPUダイは14nmの「Zeppelin(ゼッペリン)」で、ダイ上に8個のCPUコア、2チャネルのDDR4インターフェイス、32レーンのPCI Express、さらにダイ間やソケット間を接続する「Infinity Fabric」を備えている。現在は、12nmのZEN+となっているが、CPUダイの構成は変わっていない。

AMDのZEN系CPUダイのアーキテクチャ
PDF版はこちら
GLOBALFOUNDRIESの12nmプロセスで性能を向上

 AMDのCPU製品は、PC向けの「Ryzen」、ハイエンドデスクトップ(HEDT)向けの「Ryzen Threadripper」、サーバー向けの「EPYC」で全て同じZeppelin系のダイを使っている。ダイの個数と、そのコンフィギュレーションの違いで製品バリエーションを産み出している。

AMDのCPU製品とダイ構成
PDF版はこちら

 16コアと12コアのThreadripper Xは、従来のThreadripperと同様の構成。2個のZeppelin系ダイを使っている。パッケージ内には4個のダイが載せられているが、2個のダイはダミーで機能していない。下はAMDが2nd Gen ThreadripperのTech Dayで示したスライドだ。

 実際には、スライドには間違いが2点ある。まず、ダイ間接続は、Threadripper X Seriesでは2リンクで、第1世代のThreadripperと同様だ。しかし、スライドでは1リンクとなっており、リンク数が間違えている。また、ダイ間接続の帯域の51.2GB/sは、双方向(バイダイレクショナル)とされているが、これは片方向(ユニダイレクショナル)帯域だ。片方向で25.6GB/sのリンクが2リンクなので、双方向の合計帯域は102.4GB/sとなる。これらを加味して構成した図は下のようになる。

Threadripper X Seriesのブロック図
PDF版はこちら

 一方、32コアと24コアのThreadripper WXは、4個のZeppelin系ダイから構成されている。パッケージ内の4個のダイは全て相互接続されている。32コア/64スレッドの「2990WX」が4ダイを使うのは当然だが、24コア/48スレッドの「2970WX」も3ダイではなく4ダイを使う。各ダイに6コアずつの構成が基本となる。下が、AMDがTech Dayで示した、Threadripper WXの構成だ。

 このスライドにも1点間違いがある。2つのダイ同士の接続の帯域が双方向(バイダイレクショナル)で25GB/sとされているが、これは片方向(ユニダイレクショナル)帯域だ。2個のダイは1リンクで接続されており、1リンクは片方向で25.6GB/s、双方向で51.2GB/sとなる。

Threadripper WX Seriesのブロック図
PDF版はこちら

マルチダイを前提に設計されたZeppelin

 今回明らかにされた32コアのThreadripper WXの構成は、かなり意外性があるものだった。まず、Zeppelinアーキテクチャでのダイ間接続の基本から説明すると次のようになる。

 AMDのInfinity Fabricのうちデータファブリックは共通のプロトコルを使いながら、異なる物理層実装が可能な設計となっている。Threadripperでは、データ用に2種類の異なるInfinity Fabricが使われている。オンダイでCPUや各インターフェイスを結ぶInfinity Scalable Data Fabric(SDF)とCPUパッケージの中でダイ間を接続する「IFOP (Infinity Fabric On-Package)」だ。

AMDのInfinity Fabric
制御系のコントロールファブリック
データ系のデータファブリック
ZeppelinベースのZEN+のCPUダイ

 異なるダイの間を接続するIFOPは、片方向32-bit幅、双方向で合計64-bitとなるインターフェイス。レイテンシの少ないクロックフォワーディング、電圧振幅のシングルエンデッド信号。これをDRAMメモリの転送レートの2倍のレートで動作させている。DRAMがDDR4 3200だった場合は、転送レートは1レーンあたり6.4Gtpsとなる。消費エナジーは2pj/bitと極めて低くなっている。

 Zeppelin系のダイでは、ダイ上にIFOPインターフェイスが4個配置されているが、実際に使われるのは3個までだ。2ダイの16コアまでのThreadripper Xシリーズは、2つのダイの間を2リンクのIFOPで接続している。

 それに対して、EPYCはダイ間は1リンクのIFOPの接続で、各ダイにつき3リンクのIFOPが使われる。4ダイの32コアまでのThreadripper WXシリーズもEPYCと同様で、4個のダイを各ダイ3リンクのIFOPで接続する。IFOPによる接続のトポロジー自体は、EPYCも32コアThreadripper WXも変わりはない。しかし、I/Oの配置は大きく異なる。

EPYCとThreadripper WX
PDF版はこちら

 EPYCとThreadripperでは、DRAMチャネル数とPCI Expressのレーン数が異なる。EPYCでは、DRAMは8チャネル、PCI Expressは最大128レーンだ。それに対してThreadripperはDRAMは4チャネル、PCI Expressは64レーンと半数になっている。16コアまでのThreadripperでは、アクティブなダイは2個なので、当然のことながら2個のダイがそれぞれ2つのDRAMチャネル、32レーンのPCI Expressをフルに使っていた。

ThreadripperのI/O構成

 32コアまでのThreadripper WXのトポロジーは特殊だ。4個のダイのうち、DRAMインターフェイスとPCI Expressが有効になっているのは2個のダイのみ。残りの2個のダイは、DRAMとPCI Expressは直結されていない。16コアのThreadripper Xに、2個のダイを接続したような構成となっている。

Threadripperの16コアと32コアの比較
PDF版はこちら

 AMDでは、DRAMとPCI Expressが有効になっているダイを「IOダイ(IO Die)」、DRAMとPCI Expressが無効になっているダイを「コンピュートダイ(Compute Die)」と呼んでいる。32コアのThreadripper WXは、4個のダイの機能が異なる、非対称なトポロジーとなっている。

意外なThreadripper WXのトポロジー

 以前の記事では、32コアThreadripper WXのトポロジーについて、4個のダイにI/Oを分散させると予測していた。しかし、実際には2個のダイにI/Oを集中させる構成で、予測は大きく外れた。現在の32コアThreadripper WXのトポロジーの場合、メモリが直結されていないコンピュートダイは、つねにほかのダイを経由してメモリにアクセスすることになり、メモリアクセスレイテンシが長くなってしまう。

32コアThreadripperの以前の記事での予想トポロジーは右、実際の製品は左
PDF版はこちら

 なぜ、AMDはこうした構成を取ったのか。AMDのKevin Lensing氏(Corporate Vice President & General Manager, Client Compute Business Unit Computing and Graphics Business Group, AMD)は次のように説明する。

 「理由は2つある。1つ目はワークステーションのワークロードがサーバーとは大きく異なるためだ。サーバー向けのEPYCでは、各ダイにローカルメモリを接続した。サーバーのような(スレッドがつねに多数走っている)ワークロードでは、その構成が性能が出る。しかし、シングルユーザーのワークステーションでは、ワークロードによってコア数のスケールに大きな違いがある。ワークロードに合わせると、現在のThreadripperのトポロジーの方がより性能を出すことができる。

 2つ目は、プラットフォームの安定性とシンプル性だ。BIOSをアップデートするだけで現在のプラットフォームが使える互換性が重要だ。ワークステーションユーザーは毎年プラットフォームを変更できるわけではない」。

 マルチユーザーのサーバーでは、多数のスレッドがつねに走っている。サーバーのワークロードでは、32コアにコンスタントにタスクを分散できるため、各ダイにメモリが接続されているEPYCの構成の方が性能を上げやすい。

 それに対して、シングルユーザーのワークステーションでは、CPUに対する負荷の幅がずっと大きくなる。16コアまでしか必要としないワークロードも多い。また、そうしたワークロードでは、レスポンスの速さが重要となるため、メモリレイテンシが短ければ短い方がいい。逆に32コアまでスケールするようなアプリケーションでは、並列性が高まるためメモリレイテンシに対する許容度が増す。

 つまり、32コアのThreadripper WXは、負荷の軽いワークロードでは、2個のダイとローカルメモリによって、低いメモリレイテンシと広いメモリ帯域で性能を出す。32コアまでの負荷の高いワークロードでは、コンピュートダイにまで演算リソースを増やすことで、演算性能を上げて処理を速める。その場合はメモリレイテンシはクリティカルではないと想定する。そうした発想で作られている。元のThreadripperから増えた2個のダイの16コア分のCPUコアは、コンピュートを増強するためという考え方だ。

 また、Lensing氏が挙げた2つ目の理由からは、もし、32コアThreadripper WXのトポロジーを、各ダイにI/Oを分散する構成に変えた場合は、プラットフォームの互換性が保てなくなる可能性があることも示している。具体的には、CPUパッケージのピンアウトが変わってしまう可能性があると見られる。Threadripperのハイエンドデスクトップ(HEDT)/ワークステーション市場は、狭い市場であるため、プラットフォームの変更は望ましくない。それも重要な理由だろう。

OSのタスクスケジューラでI/Oダイとコンピュートダイへのタスクを制御

 非対称なI/O構成となった4ダイ構成のThreadripper WX。ローカルメモリが接続されたI/Oダイでは、DRAMアクセスレイテンシは64nsから。それに対してローカルメモリが接続されていないコンピュートダイでは、DRAMアクセスはつねにI/Oダイ経由となるため、DRAMレイテンシは105nsからとなる。この差があるため、Threadripper WXでは、タスクをCPUコアに割り当てるにあたって、CPUコアがI/Oダイかコンピュートダイかを区別しなければならない。

AMDのJoe Macri氏(Corporate Fellow and CTO, Computing and Graphics Business Group, AMD)

 AMDのJoe Macri氏(Corporate Fellow and CTO, Computing and Graphics Business Group, AMD)によると、Threadripper WXの特殊なトポロジーを、OSのタスクスケジューラ側で対応してもらうという。具体的にはNUMA(Non-uniform Memory Access)」でのメモリリージョンを区分し、タスクの割り当てに対して制御を行なう。現在はMicrosoftと、Windowsでの対応を進めているという。

 OS側が、I/Oダイであるダイ0とダイ1のリージョンに優先的にタスクを割り当てると見られる。もちろん、もっとも望ましいのは、アプリケーションごとにメモリアクセスレイテンシの許容度の違いを判別してI/Oダイとコンピュートダイに振り分けることだが、そこまで対応するかどうかはわからない。そうした対応をしようとすると、アプリケーションごとのプロファイリングが必要になると推測される。

 Armのbig.LITTLEも同様だが、現在の方向は、CPUハードウェアが均質であるという以前の前提が成り立たなくなりつつある。ソフトウェア側が、下のハードウェアの違いに対応しなければならなくなりつつある。

I/Oダイとコンピュートダイの違いを意識してタスクをスケジュールする
PDF版はこちら

ダイ間のメモリアクセス帯域の違い

 16コアまでのThreadripper Xと32コアまでのThreadripper WXでは、IFOPを経由したメモリアクセスの帯域にも大きな違いがある。I/Oダイにおける2チャネルのDRAMインターフェイスのメモリ帯域は、3.3Gtpsのメモリ転送レートの場合に、51.2GB/sとなる。16コア2ダイのThreadripper Xの場合は、2個のダイの間は2リンクのIFOPで接続されている。そのため、片方向では51.2GB/sの帯域となり、メモリアクセスの帯域そのままでダイ間転送ができる。言い換えれば、余計な遅延が生じない。

Threadripper Xと初代Threadripperでのダイ間のメモリアクセス
PDF版はこちら

 それに対して、32コア4ダイのThreadripper WXの場合は、2個のダイの間は1リンクのIFOPで接続されている。ダイ間の片方向の帯域は25.6GB/sとなり、メモリ帯域フルで読み出しをかけると、ダイ間の転送で詰まってしまうことになる。

Threadripper WXでのダイ間のメモリアクセス
PDF版はこちら

 Threadripper WXの場合は、コンピュートダイはローカルメモリインターフェイスを持たないため、つねにIFOPを使ったダイ間のメモリアクセスとなる。そのため、メモリアクセスの帯域が制約されるが、Threadripper WXの設計思想は、コンピュートインテンシブなアプリケーションを32コアまでスケールするというもの。そう考えると、この構成で問題は少ないと判断したとみられる。

 こうしてアーキテクチャを見ると、16コアのThreadripper Xと、32コアのThreadripper WXは、メモリアクセスに関してはかなり性格が異なることがわかる。AMDが16コアのThreadripper Xと、32コアのThreadripper WXで、想定ユーザー層を切り分けている理由の1つはそこにありそうだ。