標籤匹配邏輯¶
MPI 標準定義了一組規則,稱為標籤匹配,用於將源傳送操作與目標接收操作進行匹配。以下引數必須與以下源和目標引數匹配:
通訊域
使用者標籤 - 接收方可以指定萬用字元
源等級 – 接收方可以指定萬用字元
目標等級 – 萬用字元
排序規則要求,當多對傳送和接收訊息信封可能匹配時,必須使用包含最早提交的傳送和最早提交的接收的那一對來滿足匹配操作。然而,這並不意味著標籤按照它們建立的順序被消耗,例如,如果早期標籤不能用於滿足匹配規則,則可能消耗後來生成的標籤。
當訊息從傳送方傳送到接收方時,通訊庫可能會嘗試在相應的匹配接收被提交之後或之前處理該操作。如果匹配接收被提交,則這是一個預期訊息;否則,它被稱為非預期訊息。實現通常對這兩種不同的匹配例項使用不同的匹配方案。
為了減少 MPI 庫的記憶體佔用,MPI 實現通常為此目的使用兩種不同的協議:
1. 急切協議(Eager protocol)- 當傳送方處理傳送操作時,完整訊息被髮送。在 send_cq 中收到完成傳送通知,表示緩衝區可以重複使用。
2. 握手協議(Rendezvous Protocol)- 傳送方傳送標籤匹配頭部,並在首次通知接收方時可能傳送部分資料。當相應的緩衝區被提交時,響應方將使用頭部資訊直接向匹配緩衝區發起 RDMA 讀取操作。需要收到一個 fin 訊息才能重複使用緩衝區。
標籤匹配實現¶
使用了兩種型別的匹配物件:提交的接收列表和非預期訊息列表。應用程式透過呼叫 MPI 接收例程將接收緩衝區提交到提交的接收列表中,並使用 MPI 傳送例程提交發送訊息。提交的接收列表的頭部可以由硬體維護,軟體應映象此列表。
當傳送啟動併到達接收端時,如果此到達訊息沒有預先提交的接收,則將其傳遞給軟體並放入非預期訊息列表。否則,將處理匹配,包括握手處理(如果適用),將資料傳遞到指定的接收緩衝區。這允許接收端的 MPI 標籤匹配與計算重疊進行。
當提交接收訊息時,通訊庫將首先檢查軟體非預期訊息列表以查詢匹配的接收。如果找到匹配項,則使用軟體控制的協議將資料傳遞到使用者緩衝區。UCX 實現根據資料大小使用急切或握手協議。如果未找到匹配項,並且整個預提交接收列表由硬體維護,並且有空間向此列表新增一個預提交接收,則此接收將傳遞給硬體。軟體應映象此列表,以幫助處理 MPI 取消操作。此外,由於硬體和軟體在標籤匹配操作方面預計不會緊密同步,因此此影子列表用於檢測預提交接收被傳遞給硬體的情況,因為匹配的非預期訊息正在從硬體傳遞給軟體。