私は、メモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋です。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストまわりのこと経験・知識共に乏しいので、詳しい親切な方は教えて下さると幸いです。現在、まずはQEMUで、CXLが接続された環境を立ち上げようとしているので、教えて頂けると非常に有難いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。
#1. CXLとは
CPUとAccelerator間、CPUとMemory間のIFを定義した仕様です。
CXL1.1/2.0の物理層はPCIe Gen.5を使用しており、CXL3.0の物理層はPCIe Gen.6を使用する見込みです。
PCIeで定義されている仕様と、CXLで定義される仕様では、Link Layer/Transaction Layerに違いがあるため、CXLで使用されるBusは、PCIe Busに対してFlex Busと呼ばれます。
#2. CXLで扱うデバイス
CXLの仕様で定義されているデバイスは、下図に示すType1 - Type3のデバイスです。
図中のCXL.mem、CXL.cache、CXL.ioはCXLの仕様で定義されているプロトコルです。
-
Type1デバイス
Root Complexとコヒレンシをとるキャッシュを持つが、Root Complexと共有するメモリ空間を持たないPGAS NICなどのデバイス。 -
Type2デバイス
Root Complexとコヒレンシをとるキャッシュを持つが、Root Complexと共有するメモリ空間を持つGPU、FPGAなどのデバイス。デバイスとRoot Complexが共有するメモリ空間は、デバイスとRoot ComplexによりLoad/Storeのアクセスがされる。 -
Type3デバイス
Root ComplexがLoad/Storeのアクセスをするメモリ空間を持つデバイス。基本的に、Type3のデバイスは、自発的にメモリ空間上のデータを書き換えることはない。
自分の興味は、Type3デバイスなので、メモではType3デバイスのみを扱います。
#3. 従来技術の問題点
-
PCIe
CPUは、PCIeで接続されたデバイスのメモリ空間に対してLoad/Storeはできるが、Uncacheableなアクセスとなる。CPUは、PCIeのメモリ空間のデータを、自身のキャッシュに入れず、読み書きの都度、デバイスにアクセスすることになる。そのため、CPUはデータが必要になる度に、PCIeデバイスアクセスのレイテンシが発生するため、PCIe接続されたメモリは高速な演算をするためのメモリとして使用できない。
余談ですが、従来のシステムにおいて、OSのkernel等のソフトに手を入れて、PCIeで接続されたデバイスのメモリ空間のデータに対して、Cacheableなアクセスを実現しようとしましたが、できませんでした。64bit CPUは、PCIeのメモリ空間のデータに対して、64Bのキャッシュライン単位でのアクセスは行わず、8B単位のアクセスで、読み書きの都度、毎回デバイスにアクセスをしてしまう結果となりました。 -
DDR
CPUとDIMM間の信号の品質を確保するために、DDRで接続されたDRAMをCPUから離れた位置に置くことができない。加えて、DRAMの微細化の技術的な限界が見えているため、今後の1枚のDIMMの高容量化には期待できない。
マザーボードのスペースとしての問題と、微細化の技術的な問題で、DDRで接続されるDRAMの容量が頭打ちになる一方でCPUのマルチコア化が進むと、コア当たり使えるメモリ空間が小さくなり、結果として、スワップの頻度増とストレージとメモリのデータの入れ替え頻度増が引き起こされて、データアクセスのレイテンシが増えることになり、CPUは高速な演算をすることができなくなる。
以上、従来技術で将来問題となる、もしくは現在問題となっていることをクリアするために、CXLの仕様が策定されています。
DDRでの接続では、CPUからの指示に対して、定時間で応答するDeterministicな応答がデバイスに求められていますが、CXLではデバイスにDeterministicな応答は求められていません。これにより、DDRのバスでは接続できなかった、不揮発性メモリ(PM: Persistent Memory)を記録メディアとしたデバイスを接続することができるようになっています。
(何故、PMを記録メディアとするデバイスが、Deterministicな応答ができないかは、そのうち書こうと思います)
以上、CXLの基礎の基礎な感じのメモでした。