大原雄介の半導体業界こぼれ話

Gen-Z化する(?)CXL 3.1

【図1】タイムライン。厳密に言えば半年(1.0→1.1)とか15カ月(3.0→3.1)など多少ばらつきはあるが、まぁ概ね1年程度の間隔になっている

 ちょっと古い話だが、昨年(2023年)11月14日にCXL Consortiumは「CXL 3.1 Specification(仕様)」をリリースした。

 そもそもCXL 1.0がリリースされたのが2019年3月で、そこから1.1→2.0→3.0→3.1と、大体1年間隔位で新バージョンがリリースされている感じになっているのだが、CXL 2.0→3.0の時にだいぶ方向性というか目的が変わってきており、3.1でこれに拍車が掛かったように感じる(図1)。

 タイトルにも書いたが、なんか“CXLのGen-Z化”といっても良いかもしれない方向性になってきた感じ、という辺りを今月ちょっとご紹介したいと思う。

CXLの立ち上げをおさらい

 CXL(Computer Express Link)は、もともとIntelがIAL(Intel Accelerator Link)という名称で社内開発していた独自リンク規格を改称の上、一般に公開したものだ。公開のタイミングでIntelはCXL Consortiumを設立するととともに、IALのプロトコルをすべてCXL Consortiumに寄贈し、CXLをオープンな運営にすることを宣言した。このあたりの経緯は以前こちらでも書いたので割愛するが、この時はまだCXL Specification 3.0が出る直前であった。

 実はこの時期、CXL Consortiumにはいろいろ出来事があった。まず2022年2月、Gen-Z Consirtiumが事実上CXL Consortiumに吸収合併されている。そして2022年8月、今度はOpenCAPIがやはりCXL Consortiumに吸収合併されている。このOpenCAPIの吸収合併を発表した翌日に、CXL 3.0の仕様が発表された。この一連の流れの中で、明らかにCXLの目的が変わってきた感がある。

 OpenCAPIについては以前のこちらである程度説明してるので割愛するとしてGen-Zの方。結成のニュースだけではよく分からないかもしれないが、後藤弘茂氏のこちらの記事をお読みいただければもう少し分かりやすいかもしれない。

 Gen-Zはノード間というか、メモリ/ストレージプールネットワークを構築し、これにコンピュートクラスタがつながるイメージを考えていただけると分かりやすいかと思う。

 ちょっと古い話だが、2013年頃にIntelは「Rack Scale Architecture」なるものを提唱していた時期があった(図2)。ここの“Future”に出てくる、コンピュート/メモリ/ストレージ/IOをデマンドに合わせて動的にアロケートなりアサインなりして利用する、という使い方をGen-Zでは実用化しよう、というものだった。

【図2】この時はバックボーンにOmni-Path Fabricがあるのが前提だったが、第2世代Omni-Path Fabricがキャンセルになったあたりで、このRack Scale Architetureもどっかに消えてしまった

 このGen-ZがCXLに取り込まれた結果どうなったか? 図3は最初のCLX 1.0/1.1のイメージである。1つのコンピュートノードの先に、アクセラレータやストレージ/メモリデバイスが接続され、キャッシュコヒーレントで接続できるというものだ。まぁこれはIntelがIALを策定した際に想定していた使い方そのままである。続いてCXL 2.0で定義されたのがCXL 2.0スイッチである(図4)。このCXL 2.0スイッチは

  • 複数のコンピュートノードと複数のアクセラレータ/メモリ/ストレージを1:1で接続する
  • 複数のコンピュートノードで、CXL 2.0スイッチの先に繋がっているアクセラレータ/メモリ/ストレージのリソース共有を行なう

の両方が可能になった。

 ただCXL 2.0のスイッチ同士での連携というのはなく、あくまでもコンピュートノード側がホストになっており、CXL 2.0スイッチは複数のホストからのリクエストを受けて接続しているCXLデバイスを割り振る(そこで特定のホストにアロケートする形になるのか、それともリソース共有する形になるのかは、そもそもこのCXLデバイスがリソース共有できる構成になっているかどうかに関わってくるので、CXL 2.0スイッチ単体では判断できない)ことになる。

【図3】ストレージというのは、いわゆるフラッシュメモリに代表される不揮発性メモリを利用する場合に、扱いがメモリになるのかストレージになるのか、がアプリケーション側の扱いで変わるため。ちなみにGen-Zでもストレージプールが定義されていた
【図4】なんとなくイメージ的にはPCI ExpressのMR-IOVスイッチに近い。というか、MR-IOVスイッチをベースにCXL 2.0スイッチが作られているのは間違いないと思う

 ではCXL 3.0/3.1では? というと、これがさらにもう一段進化した(図5)。CXLスイッチ同士での連携を図ることにが可能になり、複数のスイッチに跨っての利用が可能になった。

【図5】あるいはEthernetもCXLデバイスにしてしまえば、リーフスイッチを丸ごと省くことも不可能ではないだろう。もっとも帯域的な面でそれがお得か? と言われるとちょっと怪しいが

 これにより、ホストから直接繋がっていないスイッチの先のCXLデバイスも利用できるようになった形だ。CXL 1.1ではノード単位の接続、CXL 2.0ではラック単位の接続が可能になったが、CXL 3.0/3.1ではInter-Rack、それこそリーフスイッチの範囲での相互接続を可能にした格好になる。

CXL 3.1では何が変わったのか?

 さて、CXL 3.0ではInter-Rack接続が可能になったわけだが、ではCXL 3.1ではこれがどう変わったか、が今回の記事の主題である。CXL 3.1では

(1) CXLスイッチ同士の接続について、HBR(Hierarchy-Based Routing)に加えてPBR(Port-Based Routing)をサポートした
(2) GIM(グローバルインターコネクトメモリ)のサポートが追加
(3) TEE(Trust-Execution-Environment)に対応したセキュリティプロトコルの追加
(4) Memory Expansion Enhancement

の4つが追加項目として挙げられている。

 まず(1)だが、これはツリー構造(USBがその代表だろう)のみだった2.0までの構造に加え、スイッチ同士でのポイントツーポイントの接続に対応した(図6)。これは特に大規模なCXLスイッチのネットワーク構築の場合に効果的となる。

【図6】トポロジーはツリー/メッシュ/リング/スター/Butterfly/Multi-Dimension。DragonFlyには多分未対応

 ちなみにHBRスイッチとPBRスイッチを混在することは可能だし、またスイッチ間のリンクを複数本にして帯域を稼ぐリンクアグリゲーションもサポートしているので、たとえば単純なツリーではなくファットツリーにすることも可能である(それに意味があるかどうかはまた別にして)。

 次に(2)だが、これはCXLファブリックを経由してホスト側に装着されているメモリとFAM(Fabric-Attached Memory)と同等のものとして扱えるようになる。CXL 3.0まで、1つのCXLスイッチに接続された2つのホスト同士でメモリ共有と言うのは、要するにCXLメモリプール(ここでいうFAM)を2つのホストで共有する形にするやり方しかなかった。ところが今度はFAMがなくても、直接2つのホストのローカルメモリ(ここでいうGIM)を共有できる形になる。

 ちなみにこのメモリ共有を高速化するために、FAST(Fabric Address Segment Table)と呼ばれるものが新たに追加され、これを利用してより簡単なアクセスを可能にしている。

 それに絡んで、たとえばあるホストのGIMをCXL経由で別のホストからアクセスする際に、トランザクション制御とかプロテクション機能などを付加することも「理論上は」可能だが、さすがにこのあたりは“Details of this functionality are beyond the scope of this Specification.”とされている。まずはアクセスできるようにするところから、というあたりだろうか。

【図7】OpenMPがこれに対応すれば、広帯域な共有メモリを構築できることになるのだが、従来の方式と比べてレイテンシがどうなるのか? がちょっと気になるところ

 (3)については、もともとCXL 2.0の時からホストとデバイスの間のセキュリティ機能としてIDE(Integrity and Data Encryption)と呼ばれる仕組みが搭載されていた(図8)。CXL 3.1ではこれを拡張し、Trusted VMをそのほかのVMのトラフィックと分離して扱えるようになった。いわゆるConfidential Computingをきちんとやる場合、物理的なリソースのパーティショニングが求められることが普通であり、これに対応した形である。

【図8】これはCXL 2.0の話なのであくまでも経由するスイッチは1つだが、CXL 3.0以降では複数のスイッチに跨る形でIDEを使ってHostとDeviceが通信する形になる

 最後の(4)だが、これはいくつか項目がある。そのうちの1つがDirect P2Pである(図10)。そもそもCXLは非対称構成のI/Fなので、CXLデバイスが自分から外部のメモリをアクセスすることはできない(ホストからはアクセスできる)。ところがCXL 3.1では、Direct P2Pを利用することで、同じCXLスイッチのDSP(DownStream Port)に接続されたCXL メモリに対してアクセスを行なうことができるようになった。

【図9】あくまでも分離されているのはホスト側のVMと、デバイス側のメモリの領域だけで、通信は両方まとめる形である
【図10】だんだん機能が増えてきて、CCIXと何が違うんだ? という感じになりつつある

 なんというか、RDNAのローカル版とでもいった形だろうか。これまでのCXLでは、アクセラレータは自分がローカルで保有するメモリしか扱えなかったが、今後は外部のメモリ Poolを利用できるようになるわけだ。

 ほかにもMemory Expanderの拡張(たとえばCXL 3.0まではメタデータは2bitだったが、3.1ではEMD:Extended Meta Dataのサポートが追加され、最大32bitまで利用可能になった)やRAS機能の拡充などもCXL 3.1のMemory Expansion Enhancementの項目として挙げられている。

CXLスイッチも進化

 ちなみにこれだけいろいろ拡張するとなると、もちろんCXLスイッチの側で行なうべき作業がかなり多くなる。これを管理するのがファブリックマネージャー(Fabric Manager)であり、このファブリックマネージャーを利用するためのAPIも新たに追加されることになった(図11)。

【図11】FM APIはPBRスイッチのみが対象で、HBRスイッチは対象になってない辺りがちょっと不思議ではある

 図12にCXLのバージョンごとの仕様の違いをまとめてあるが、随分増えたというか、もう3.0辺りからシステムインターコネクト的に進化しているのが分かる。

 ちなみにCXL 3.0ないし3.1対応デバイスが出てくるのは、要するにPCI Express 6.0が利用可能になるタイミングである。時期的にはまだだいぶ先、Intelで言えばGranite Rapidsなどで使われるLGA7529の次以降だろうし、これはAMDも同じでSocket SP5の次(SP6?)になるだろう。

 早ければ2025年辺りにプレビューが出てくるかもしれないが、実際に出荷されるのは2026年度以降になるだろう。その頃にはPCI Express 7.0の標準化の目途が見えてきて、これをサポートするCXL 4.0に関しても動きが活発化してゆくと思われる。さて、次にはどんな機能が追加されるのだろう?

【図12】CXLのバージョンの仕様の違い