大原雄介の半導体業界こぼれ話
Gen-Z化する(?)CXL 3.1
2024年2月28日 06:13
ちょっと古い話だが、昨年(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では実用化しよう、というものだった。
この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スイッチ単体では判断できない)ことになる。
ではCXL 3.0/3.1では? というと、これがさらにもう一段進化した(図5)。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スイッチのネットワーク構築の場合に効果的となる。
ちなみに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.”とされている。まずはアクセスできるようにするところから、というあたりだろうか。
(3)については、もともとCXL 2.0の時からホストとデバイスの間のセキュリティ機能としてIDE(Integrity and Data Encryption)と呼ばれる仕組みが搭載されていた(図8)。CXL 3.1ではこれを拡張し、Trusted VMをそのほかのVMのトラフィックと分離して扱えるようになった。いわゆるConfidential Computingをきちんとやる場合、物理的なリソースのパーティショニングが求められることが普通であり、これに対応した形である。
最後の(4)だが、これはいくつか項目がある。そのうちの1つがDirect P2Pである(図10)。そもそもCXLは非対称構成のI/Fなので、CXLデバイスが自分から外部のメモリをアクセスすることはできない(ホストからはアクセスできる)。ところがCXL 3.1では、Direct P2Pを利用することで、同じCXLスイッチのDSP(DownStream Port)に接続されたCXL メモリに対してアクセスを行なうことができるようになった。
なんというか、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)。
図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に関しても動きが活発化してゆくと思われる。さて、次にはどんな機能が追加されるのだろう?