私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋です。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。
#1. CXLデバイスとホストCPUとの通信
「CXLその1」で言葉が出てきましたが、CXLの仕様書では、以下の3種類のプロトコルが規定されています。
-
CXL.io
PCIeをベースとしたプロトコル。CXLデバイスのレジスタの読み書きにはCXL.ioのプロトコルが使用されます。初期化、デバイスの動作設定、割り込み、エラー情報やヘルス情報の取得等が使用目的となります。全てのCXLデバイスでサポートが必須(Mandatory)となっています。基本的にCXL.ioのプロトコルでのデータのやり取りでは、低レイテンシと広帯域での通信は求められていません。 -
CXL.cache
ホストCPUのキャッシュと、CXLデバイスのキャッシュのコヒーレンシを管理するためのプロトコル。Type1とType2のデバイスで使用されるプロトコルです。CXL.cacheのプロトコルでのデータのやり取りは、低レイテンシと広帯域での通信が要求されます。 -
CXL.mem
ホストCPUがCXLデバイスのメモリへの読み書きを行うためのプロトコル。
キャッシュのコヒーレンシを管理するためのプロトコル。Type2とType3のデバイスで使用されるプロトコルです。CXL.memのプロトコルでのデータのやり取りは、低レイテンシと広帯域での通信が要求されます。
CXLの仕様書で規定されているFlex Busの階層を下図に示します。
下図に示す通り、CXL.ioとCXL.cache/CXL.memとは、別のTransaction LayerとLink Layerとなっています。CXL.ioは従来のPCIeベースのプロトコル、CXL.cache/CXL.memは新しくCXLで規定されるプロトコルとなっています。
CXL.ioとCXL.cache/CXL.mem、それぞれのプロトコル取り扱われるデータは、別のTransaction LayerとLink Layerを経て、同じFlex Bus上の物理層に流されます。同じ物理層に、PCIeとCXL、それぞれで定義される異なる構造、異なるサイズのデータが流れることになります。
自分の興味は、Type3デバイスなので、以降、Type3で使用されないCXL.cacheプロトコルの詳細には、ほぼ触れません。
#2. CXL.memのコマンド
CXL Type3デバイスに実行指示されるコマンドを以下の表に示します。
Command | Device Response | 概要 |
---|---|---|
MemRd/MemRdData | Data | メモリのデータ読み出しと、メタステートの更新。 |
MemInv/MemInvNT | Completion | メタステートの読み出しと、メタステートの更新。 |
MemSpecRd | None | メモリのデータの投機的読み出し。 |
MemWr/MemWrPtl | Completion | メモリのデータ書き込みと、メタステートの更新。 |
コマンドで読み書きされるデータのサイズは、基本的には、ホストCPUのキャッシュラインサイズに合わせて64B単位です。
MemRd/MemRdDataでは、CXLデバイスのメモリからデータの読み出しが実行されます。MemRd/MemRdDataの応答は、CXLデバイスのメモリから読み出された64BのデータのみがホストCPUに返ります。
MemInv/MemInvNTでは、CXLデバイスで管理されているキャッシュラインの状態(メタステート)の読み出しが実行されます。MemInv/MemInvNTの応答は、実行結果としてメタステートの情報が含まれるコンプリーションがホストCPUに返ります。
MemSpecRdでは、CXLデバイスのメモリ(不揮発性メモリやDRAM)から、CXLデバイス内部のキャッシュ/バッファ(SRAMなど)にデータが読み出されます。ホストCPUは、CXLデバイス内部のキャッシュ/バッファに読み出されたデータに対して、低レイテンシでアクセスすることができます。ホストCPUが投機的な読み出しを行う際に使用されます。MemSpecRdの応答は、ホストCPUに返りません。
MemWr/MemWrPtlでは、CXLデバイスのメモリへのデータの書き込みが実行されます。MemWrでは64B単位でデータが書き込みが実行され、MemWrPtlでは64B未満の書き込みが実行されます。MemWr/MemWrPtlの応答は、実行結果としてコンプリーションがホストCPUに返ります。
CXLでは、デバイスのキャッシュはMESIプロトコルでコヒーレンシが取られており、メタステートで、キャッシュラインがいずれの状態にあるかが管理されています。
Type2のデバイスの場合は、キャッシュにはMESIプロトコルが適用されるため、それぞれのコマンドで受信したメタステートの更新には、MESIプロトコルに従い、CXLの仕様で定められた対応がなされます。
Type3のデバイスの場合、キャッシュを持っていたとしても、MESIプロトコルでコヒーレンシを管理する対象となっていません。Type3のデバイスで扱われるメタステートは、CXLの仕様の対象外とされています。
#3. CXL.memプロトコルのデータ転送単位
CXL.cache/CXL.memでは、Flitと呼ばれる単位でコマンドとデータが転送されます。
Flitの概要を下図に示します。
Protocol Flitは、先頭に32bitのFlit Headerが付いたFlitで、1つのHeader Slotと3つのGeneric Slotと16bitのCRCで構成さています。
All Data Flitは、4つのData Chunkと16bitのCRCで構成されています。
Protoclo FlitのHeader Slotにはコマンド、Generic Slotにはコマンドもしくはデータが入ります。
All Data FlitのData Chunkにはデータが入り、4つのData Chunkで合計64Bのデータを転送することができます。
次回は、Flitの詳細について書こうと思っています。