3

PSMはタグマッチングをサポートするライブラリだと聞きました。タグマッチングインターフェースとは?MPI のコンテキストでタグマッチングがパフォーマンスにとって重要なのはなぜですか?

4

1 に答える 1

4

MPI のタグ マッチングの概要: https://www.hpcwire.com/2006/08/18/a_critique_of_rdma-1/セクション「マッチング」

MPI は、大きなマッチング スペースを持つ両面インターフェイスです。MPI Recv は、Sender、Tag、Context などのいくつかの基準に従って MPI Send に関連付けられ、最初の 2 つは無視される可能性があります (ワイルドカード)。マッチングは必ずしも順番どおりではなく、さらに悪いことに、MPI Recv のマッチングの前に MPI Send がポストされる可能性があります... MPI は 64 ビットのマッチング情報を必要とし、MX、ポータル、および QsNet はそのようなマッチング機能を提供します。

InfiniBand Verb およびその他の RDMA ベースの API はマッチングをまったくサポートしていません

したがって、PSM は、Infiniband スタイルのネットワーク アダプター (最初のバージョンではソフトウェア マッチングを使用しますが、マッチングの一部をハードウェアに移動する可能性があります) への高速マッチングを含める方法のように思えます。

PSM の公開ドキュメントが見つかりません (ユーザー ガイドhttp://storusint.com/pdf/qlogic/InfiniPath%20User%20Guide%202_0.pdfに詳細はありません)。しかし、ライブラリのソースがあります: https://github.com/01org/psm

詳細の一部は、PSM2 プレゼンテーションhttps://www.openfabrics.org/images/eventpresos/2016presentations/304PSM2Features.pdfに記載されています。

PSMとは何ですか?一致したキュー (MQ) コンポーネント

  • • タグマッチングを使用して MPI のニーズにセマンティックにマッチング
  • • 通信進行保証の呼び出しを提供
  • • MQ 完了セマンティクス (標準対同期)

PSM API

  • • 64 ビット タグを使用したグローバル タグ マッチング API
  • • ジョブごとに最大 64,000 プロセスまで拡張可能
  • • MQ API は、エンドポイント間のポイントツーポイント メッセージ パッシングを提供します。
  • • 例 psm_mq_send、psm_mq_irecv
  • • 「recvfrom」機能なし – 一部のアプリケーションで必要

そのため、64 ビットのタグがあります。すべてのメッセージにはタグがあり、Matched Queue にもタグがあります (タグ マッチングの実装によっては、タグ マスクもあります)。ソース psm_mq_internal.h: mq_req_match() https://github.com/01org/psm/blob/67c0807c74e9d445900d5541358f0f575f22a630/psm_mq_internal.h#L381によると、PSM にはマスクがあります。

typedef struct psm_mq_req {
...
    /* Tag matching vars */
    uint64_t    tag;
    uint64_t    tagsel;     /* used for receives */
...
} psm_mq_req_t;

mq_req_match(struct mqsq *q, uint64_t tag, int remove)
)
{
    psm_mq_req_t *curp;
    psm_mq_req_t cur;

    for (curp = &q->first; (cur = *curp) != NULL; curp = &cur->next) {
      if (!((tag ^ cur->tag) & cur->tagsel)) { /* match! */
        if (remove) {
          if ((*curp = cur->next) == NULL) /* fix tail */
            q->lastp = curp;
          cur->next = NULL;
        }
        return cur;
      }
    }

そのため、受信タグがtag受信の xor され、MQ にポストされ、結果が受信と結合された場合に一致しtagselます。これらの操作の後にビットが 0 しかない場合、一致が見つかり、それ以外の場合は次の受信が処理されます。

関数からpsm_mq.hのコメントhttps://github.com/01org/psm/blob/4abbc60ab02c51efee91575605b3430059f71ab8/psm_mq.h#L206psm_mq_irecv()

/* Post a receive to a Matched Queue with tag selection criteria
 *
 * Function to receive a non-blocking MQ message by providing a preposted
 * buffer. For every MQ message received on a particular MQ, the tag and @c
 * tagsel parameters are used against the incoming message's send tag as
 * described in tagmatch.
 *
 * [in] mq Matched Queue Handle
 * [in] rtag Receive tag
 * [in] rtagsel Receive tag selector
 * [in] flags Receive flags (None currently supported)
 * [in] buf Receive buffer 
 * [in] len Receive buffer length
 * [in] context User context pointer, available in psm_mq_status_t
 *                    upon completion
 * [out] req PSM MQ Request handle created by the preposted receive, to
 *                 be used for explicitly controlling message receive
 *                 completion.
 *
 * [post] The supplied receive buffer is given to MQ to match against incoming
 *       messages unless it is cancelled via psm_mq_cancel @e before any
 *       match occurs.
 *
 * The following error code is returned.  Other errors are handled by the PSM
 * error handler (psm_error_register_handler).
 *
 * [retval] PSM_OK The receive buffer has successfully been posted to the MQ.
 */
psm_error_t
psm_mq_irecv(psm_mq_t mq, uint64_t rtag, uint64_t rtagsel, uint32_t flags,
         void *buf, uint32_t len, void *context, psm_mq_req_t *req);

データをタグにエンコードする例:

 *     uint64_t tag = ( ((context_id & 0xffff) << 48) |
 *                      ((my_rank & 0xffff) << 32)    |
 *                      ((send_tag & 0xffffffff)) );

マスクを使用tagselすると、「すべてに一致」、「一部のバイトまたはビットが値と等しいタグと一致、その他のすべてに一致」、「正確に一致」の両方をエンコードできます。

新しい PSM2 API もあり、オープン ソースもあります - https://github.com/01org/opa-psm2 、 http://www.intel.com/content/dam/support/us/en/documents/で公開されているプログラマー ガイドnetwork/omni-adptr/sb/Intel_PSM2_PG_H76473_v1_0.pdf .

PSM2 ではタグが長くなり、マッチング ルールが定義されます (stag は「メッセージ送信タグ」 - メッセージで送信されるタグ値、rtag は受信リクエストのタグです): https://www.openfabrics.org/images/eventpresos /2016presentations/304PSM2Features.pdf#page=7

タグマッチングの改善

  • • タグサイズを 96 ビットに増加
  • • 基本的に((stag ^ rtag) & rtagsel) == 0
  • MPI_ANY_SOURCE•やMPI_ANY_TAGゼロ ビットを使用するなどのワイルドカードをサポートします。rtagsel
  • • 事実上無制限のスケーラビリティを実現
  • • ジョブあたり最大 6,400 万プロセス

PSM2 タグマッチング

#define PSM_MQ_TAG_ELEMENTS 3 
typedef 
struct
 psm2_mq_tag { 
    union { 
        uint32_t tag[PSM_MQ_TAG_ELEMENTS] __attribute__((aligned(16))); 
        struct { 
            uint32_t tag0; 
            uint32_t tag1; 
            uint32_t tag2; 
        }; 
    }; 
} psm2_mq_tag_t;
  • • アプリケーションは「tag」配列または「tag0/tag1/tag2」を入力し、PSM に渡します。
  • • タグとタグ マスクの両方が同じ 96 ビット タグ タイプを使用します。

実際には、構造体の一致する変数の近くにソース ピア アドレスがありますpsm2_mq_req: https://github.com/01org/opa-psm2/blob/master/psm_mq_internal.h#L180

   /* Tag matching vars */
   psm2_epaddr_t peer;
   psm2_mq_tag_t tag;
   psm2_mq_tag_t tagsel;    /* used for receives */

そして、 https://github.com/01org/opa-psm2/blob/85c07c656198204c4056e1984779fde98b00ba39/psm_mq_recv.c#L188mq_list_scan()から呼び出される、一致するソフトウェア リストのスキャン:mq_req_match()

psm2_mq_req_t
mq_list_scan(struct mqq *q, psm2_epaddr_t src, psm2_mq_tag_t *tag, int which, uint64_t *time_threshold)
{
    psm2_mq_req_t *curp, cur;

    for (curp = &q->first;
         ((cur = *curp) != NULL) && (cur->timestamp < *time_threshold);
         curp = &cur->next[which]) {
        if ((cur->peer == PSM2_MQ_ANY_ADDR || src == cur->peer) &&
            !((tag->tag[0] ^ cur->tag.tag[0]) & cur->tagsel.tag[0]) &&
            !((tag->tag[1] ^ cur->tag.tag[1]) & cur->tagsel.tag[1]) &&
            !((tag->tag[2] ^ cur->tag.tag[2]) & cur->tagsel.tag[2])) {
            *time_threshold = cur->timestamp;
            return cur;
        }
    }
    return NULL;
}
于 2016-07-10T15:05:52.827 に答える