NDKPI 延遲處理方案
在許多情況下,NDK 使用者會將啟動請求的鏈發送到佇列組 (QP)。 例如,消費者可以發送數個快速註冊請求,然後接著傳送請求。 如果將這類請求模式中的請求鏈結排入 QP 佇列,然後批次地通知硬體進行處理,而不是一條一條地通知硬體,性能可能會得到改善。
NDK_OP_FLAG_DEFER 旗標值可用於下列要求類型:
- 恩德克賓德 (NDK_FN_BIND)
- NdkFastRegister (NDK_FN_FAST_REGISTER)
- NdkInvalidate (NDK_FN_INVALIDATE)
- NdkRead (NDK_FN_READ)
- 恩德克森德 (NDK_FN_SEND)
- NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE)
- NdkWrite (NDK_FN_WRITE)
旗標的出現對 NDK 提供者來說是一個提示,它可能會延遲將請求提交給硬體進行處理,但提供者可以在任何時候處理新的請求。
啟動器要求中出現的 NDK_OP_FLAG_DEFER 標誌不會改變 NDK 提供者在完成產生方面的既有責任。 向啟動器要求發出的呼叫,如果返回失敗狀態,絕不會使該失敗要求被排入 CQ 的完成隊列。 相反地,傳回成功狀態的呼叫最終必須導致完成排入佇列至 CQ,只要取用者遵循下面所列的其他需求。
除了所有現有的 NDK 需求之外,還必須觀察兩個額外的需求(一個用於提供者和一個供取用者使用),以防止要求成功張貼到具有 NDK_OP_FLAG_DEFER 旗標的 QP,但永遠不會向硬體指出進行處理:
- 當從起始器請求中回傳失敗狀態時,提供者必須保證先前以 NDK_OP_FLAG_DEFER 標誌提交的所有請求都已指示硬體進行處理。
- 消費者保證,如果沒有內嵌失敗,所有啟動器請求鏈結都會由未設置 NDK_OP_FLAG_DEFER 標誌的啟動器請求來終止。
例如,考慮一個案例,當取用者有兩個快速註冊請求的鏈結,以及需要發送至 QP 的任務時:
- 消費者會以 NDK_OP_FLAG_DEFER 旗標發起第一次快速註冊,NdkFastRegister 會傳回 STATUS_SUCCESS。
- 同樣地,第二個快速緩存器會以設定 NDK_OP_FLAG_DEFER 旗標張貼,但現在 NdkFastRegister 傳回失敗狀態。 在此情況下,消費者不會提交傳送要求。
- 當傳回第二次呼叫 NdkFastRegister的內嵌失敗時,NDK 提供者可確保所有先前未指示的要求(在此案例中為第一次快速註冊)都會交付給硬體進行處理。
- 因為第一次呼叫 NdkFastRegister 成功,因此必須產生 CQ 的完成。
- 因為第二次呼叫 NdkFastRegister 以內嵌方式失敗,因此不能產生給 CQ 的完成通知。