2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CXL (Compute Express Link) その6 - CXLデバイスとホストCPU間の通信

Posted at

私はメモリデバイスの不揮発性メモリ制御やホスト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で規定されるプロトコルとなっています。
FlexBusLayers.png
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の概要を下図に示します。
Flit.png
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の詳細について書こうと思っています。

2
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?