upmem-ハッシュテーブル

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_PIM_chip

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 用に設計された線形メモリ アロケータです。

    MRAM
    • DPU_MRAM_HEAP_POINTERDPUプログラムは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()

おすすめ

転載: blog.csdn.net/qq_49588762/article/details/126919480