私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。
今回はCXL2.0で定められたGlobal Persistent Flush(GPF)について書きます。
1. Global Persistent Flush(GPF)
GPFは、CXLその4で概要を書きましたが、ホストシステムからCXLデバイスへの電源の供給が止められる前などに使用される機能で、CXLで接続されたデバイスのキャッシュやバッファ内に保持されているデータの整合性を保ちつつ、不揮発性メモリに記録するための機能です。
GPFは、ホストシステムの電源を切る場合、CXLメモリデバイスを物理的に交換する場合、停電などの要因でホストシステムへの電源供給がストップした場合などのユースケースで使用されます。
GPFは、CXL2.0以降の仕様に対応する全ての機器がサポートすることが必須の機能です。
ホストシステムは、CXLメモリデバイスのGPFに関連する情報は、CXL.ioでやり取りされるPCIe VDM(Vendor Defined Message)と、レジスタを通して取得することができます。
CXL.ioで使われるPCIe VDMは複数種類あります。PCIe VDMの詳細については、別途書こうと思います。
1.1 GPF Flow
GPFは、Phase 1とPhase 2の2段階で実行されます。GPF Flowの概略を下図に示します。
GPF実行の要求と応答(GPF Phase1 Req、GPF Phase1 Rsp、GPF Phase2 Req、GPF Phase2 Rsp)は全て、PCIe VDMが使われます。
-
Phase 1
CXL.cacheをサポートするCLXデバイス(Type1/Type2)が、キャッシュのデータの整合性を確保しつつ、ライトバックの処理を行います。Type3のCXLメモリデバイスの場合は、Phase 1で特に必要な処理はありません。
Host CPUは、Phase 1の完了をホストシステムで定めた時間まで待ちます。時間内に完了通知が返ってこない場合、Phase1をエラーとして終了し、CXLデバイスに対してPhase2の実行を指示します。 -
Phase 2
CXLデバイス内部のバッファなど不揮発性メモリに書かれていないデータを、不揮発性メモリに書き込みます。Phase2では、CXL.memのコマンドでのRead/Writeは行われません。
Phase2実行指示にPhase1でエラーが発生したことが通知された場合、もしくはPhase2実行中にエラーが発生した場合は、Dirty Shutdown State=1であることを不揮発性メモリに書き込みます。CXLデバイスは、次回の起動時にDirty Shutdown State=1を検出した場合は、Dirty Shutdown Counterをインクリメントし、Dirty Shutdownが行われたことをホストシステムに通知します。
なお、GPFの処理開始前にはCPU内のキャッシュのデータはフラッシュされます。CPUがフラッシュする対象としているのは下図のeADRのデータです。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2292852%2Fb92538f8-f147-0980-e193-a1e46c7c9957.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d543bfce9abec26ac6f371087381fefa)
1.2 GPF Parameters
CXLメモリデバイスがホストシステムに通知するGPFに関連する情報は、PCIe VDMとレジスタで通知されます。
-
PCIe VDM
PCIe VDMでは、CXLメモリデバイスがGPFに対応しているか否かを通知します。
CXL1.1対応のデバイスの場合、PCIe VDMで通知されるデバイス情報のパラメータのうちGPF対応を示す箇所は0b固定(CXL1.1の仕様ではReserve)です。 -
レジスタ
レジスタでは、CXLメモリデバイスが、GPF Phase2完了までに掛かる時間とGPF Phase2で消費する電力を通知します。
GPF Phase2完了までに掛かる時間は、0usから150sまでの範囲で通知することができます。
GPF Phase2で消費する電力は、0mWから4MWまでの範囲で通知することができます。
Phase2完了までの時間と消費電力は、搭載されている不揮発性メモリの特性やDRAM容量、コントローラなどにより、CXLメモリデバイスの製品毎に違います。
レジスタでCXLメモリデバイスから通知される情報は、Phase 2に関連する情報のみです。
CXL2.0の仕様では、ホストシステムがPhase1完了を待つwait時間は、ホストシステム自身で生成したHMATの情報から、CXLデバイスの帯域やCXLデバイスのキャッシュサイズ等の情報を元に算出し、システム構成や信号伝搬の遅延や処理の遅延事件を考慮して決定することになっています。
また、Phase1の処理中にCXLデバイスで消費される電力は、システム動作中にCXLデバイスがアクティブな状態(D0 State)で消費される電力としており、ホストシステムは測定することによって消費電力の情報を取得することができるとしています。
ホストシステムがHMATを生成のために使用するCXLデバイスの情報は、PCIeの仕様で定められるData Object Exchange(DOE)の仕組みを使い、Coherent Device Attribute Table(CDAT)として、CXLデバイスから取得することができます。DOEの仕様はPCIe6で定められ、CDATの仕様はUEFIフォーラムからリリースされています。
CXLの仕様では、ホストシステムは、GPFのPhase1とPhase2を完了させるまでの時間と、それぞれのPhaseでCXLデバイスに供給する必要のある電力から、GPF開始から完了までに必要な消費電力量を見積もる事ができるとしています。
従って、ホストシステムが、電源の供給のストップを検出した場合、扱っているデータをGPFで不揮発性メモリに退避させるまでにUPSなどで、供給すべき電力量が分かるということになっています。
CXLの仕様では上記のように記載されていますが、CXLメモリデバイスのベンダーの立場としては、データの信頼性の観点から、GPFの実行開始が指示された場合、GPF Phase2完了まで、ホストシステムから電力が供給されることをあてにすることはありません。従って、不揮発性メモリを搭載したCXLメモリデバイスの製品では、キャパシタ等を実装し、GPF Phase2の処理が完了できるまでの電力を自分で賄えるように対応するのが、一般的になるかと思います。
Enterprise向けに市販されているNANDのSSDでも、同様の立場ですので、電源断に備えてキャパシタを搭載するのが、一般的かと思います。
CXLメモリデバイスが、特定のシステム専用でGPF Phase2完了まで電力が確実に供給される場合は、キャパシタ等での対策は不要かと思います。
余談ですが、GoogleやAmazonなどのハイパースケーラーは、自分達のシステムで使うSSDは、NANDフラッシュメモリとコントローラを買ってきて、FWのカスタマイズをして基板に実装して作ります。同様に、ハイパースケーラーが自分達で使うCXLメモリデバイスを作る場合は、コスト削減の一環としてキャパシタを実装しないかもしれません。
いずれにしても、一般的に市販されるCXLメモリデバイスは、GPF Phase2の処理を完了させるまでの電力はキャパシタを使って自前で供給できるようにし、GPFの処理中の電源断だけでなく、GPF実行の指示がされていない場合の電源断であっても、CXLメモリデバイスが受信したユーザデータを確実に不揮発性メモリに書き込みが完了できるようすると思います。