upmem 設計アーキテクチャ
upmem は PIM (メモリ内処理) メモリ チップです。
-
DIMM 20 枚。
Intel サーバーには 20 個の DIMM があり、1 つの DIMM が 1 つの UPMEM モジュールになります。
-
各 UPMEM PIM DIMM には 128 個の DPU が含まれています
各 UPMEM モジュールには 128 個の DPU、つまり 128 個のプロセッサが含まれています。
-
各 DPU には 64 MB MRAM、24 KB IRAM、および 64 KB WRAM が含まれています
各 DPU には、24 KB の IRAM、64 KB の WRAM、および 64 MB の MRAM が含まれています。IRAM は命令キャッシュ、WRAM はプログラムの実行メモリです。ここには、スタック、グローバル変数などが事前定義されたスキームに従って配置されます。MRAM は「外部ペリフェラル」とみなされ、MRAM 変数へのすべてのアクセスは MRAM 転送を意味します。
-
DPU は 24 スレッド、32 ビット RISC プロセッサです
DPU のプロセッサは 24 スレッド プロセッサであり、各 DPU には 24 個の使用可能なスレッドがあります。
upmemプログラミング
upmem の公式 Web サイトのドキュメントを詳しくお読みください。
upmem ハッシュテーブルの設計
-
全体的なアーキテクチャ
-
バケット パーティションを DPU に保存する
バケットを個々の DPU に分割します。DPU0 はバケット [0] ~buckets[HT_SIZE_PER_PDU-1] を保存し、DPU1 はバケット [HT_SIZE_PER_PDU] ~buckets[2*HT_SIZE_PER_PDU-1] を保存します……
-
メタデータをホスト キャッシュに保存する
Hashtale の一部のメタデータ (割り当てられた DPU の数や各 DPU に保存されているバケットの数など) はホスト DRAM に保存されます。HashFunction を使用して、処理するリクエストを各 DPU に振り分けます。
-
毎回バッチリクエストを処理する
ホストが DPU を呼び出して要求を処理するため、システム コールが関与し、オーバーヘッドが比較的高くなるため、毎回 1 つの要求バッチを処理することを選択します。
-
-
追加、削除、変更、確認のプロセス
Hashtable が要求を受信した後、まず HashFunction を使用してbucket_indexを計算し、bucket_indexとメタデータを通じて要求に対応するDPUとbucket_idを計算し、要求の内容を対応するDPUに転送し、DPUを実行し、DPUが要求を解析し、追加、削除、チェック、および変更操作を実行し、最終的にホストは DPU 処理結果を取得します。
以下は、追加、削除、確認、変更のプロセスの疑似コードです。
index = HashFunction(key); dpu = index / HT_SIZE_PER_PDU; // 获取操作dpu_id bucket = index % HT_SIZE_PER_PDU; // 获取对应dpu中bucket_id dpu_push_xfer(dpu_set, DPU_XFER_TO_DPU, request); // 传输请求内容 dpu_launch(dpu_set, DPU_SYNCHRONOUS); // 运行dpu dpu_push_xfer(dpu_set, DPU_XFER_FROM_DPU, response); // 获取response
-
MRAM_アロケータ
MRAM_allocator は、MRAM 用に設計された線形メモリ アロケータです。
-
DPU_MRAM_HEAP_POINTER
DPUプログラムはMRAMから最後まで自由に使用できます。UPMEM DPU ランタイム ライブラリは MRAM のメモリを管理します。MRAM は 2 つの部分に分割され、0 ~ PU_MRAM_HEAP_POINTER は MRAM 変数によって使用され、サイズは 1MB です。DPU_MRAM_HEAP_POINTER から最後までの部分は DPU プログラムによって自由に使用され、サイズは63MBです。
-
MRAM の任意部分を管理するために線形メモリ アロケータを設計します。
DPU_MRAM_HEAP_POINTER から最後までの部分は生のメモリとみなすことができ、これを管理するためにリニア メモリ アロケータを設計しました。
-
DMA 転送を容易にするために、メモリ割り当ては 8 バイト アライメントを満たす必要があります。
-
upmem-ハッシュテーブルのソースコード
コードはgithubにアップロードされました。
upmem ハッシュテーブルの最適化
私たちはいくつかの最適化提案を提案し、これらの最適化を以降のバージョンの upmem-hashtable に実装する予定です。
- 同時実行性
- 各 DPU は 24 スレッドを使用できますが、完全なパフォーマンスを実現するには 12 スレッドを超える必要があります
- クエリ操作の場合、直接同時クエリ
- 追加、削除、変更の操作には同期ロックが必要です。
- 頻繁な DPU と CPU の相互作用を回避する
dpu_push_xfer()
並列伝送を行うことで伝送効率を向上させることができます。dpu_push_xfer()
どちらもdpu_launch()
システムコールを必要とし、多くのオーバーヘッドが発生します- 毎回バッチリクエストを処理する
- MRAM_アロケータ
- 動的メモリアロケータの設計
- WRAMとMRAM間のデータ転送
- より大きなストリングについては、伝達効率を向上させるために採用され
mram_write()
ますmram_read()
。
- より大きなストリングについては、伝達効率を向上させるために採用され