NDK コンシューマーがイニシエーター要求のチェーンをキュー ペア (QP) に頻繁にポストするケースが多く見られます。 たとえば、コンシューマーは多数の高速レジスタ要求の後に送信要求を行うことができます。 このような要求パターンのパフォーマンスは、チェーン内の各要求をハードウェアに 1 つずつ示すのではなく、要求のチェーンが QP にキューに入れられ、バッチとして処理するようにハードウェアに示された場合に改善される可能性があります。
NDK_OP_FLAG_DEFER フラグの値は、次の要求の種類でこの目的で使用できます。
- NdkBind (NDK_FN_BIND)
- NdkFastRegister (NDK_FN_FAST_REGISTER)
- NdkInvalidate (NDK_FN_INVALIDATE)
- NdkRead (NDK_FN_READ)
- NdkSend (NDK_FN_SEND)
- NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE)
- NdkWrite (NDK_FN_WRITE)
フラグの存在は、処理のためにハードウェアへの要求を延期する可能性があることを NDK プロバイダーに示すヒントですが、プロバイダーはいつでも新しい要求を処理できます。
イニシエーター要求に NDK_OP_FLAG_DEFER フラグが存在しても、完了の生成に関する NDK プロバイダーの既存の責任は変わりません。 失敗を示すステータスを返すイニシエータリクエストの呼び出しは、失敗したリクエストの完了処理が CQ にキューされる結果を招いてはなりません。 逆に、成功状態を返す呼び出しは、コンシューマーが以下に示す追加の要件に従っている限り、最終的に完了が CQ にキューに入れられる必要があります。
既存のすべての NDK 要件に加えて、2 つの追加要件 (プロバイダー用とコンシューマー用の 1 つ) を確認して、 要求が NDK_OP_FLAG_DEFER フラグを使用して QP に正常にポストされるが、処理のためにハードウェアに指示されない状況を防ぐ必要があります。
- イニシエーター要求の呼び出しからエラー状態を返す場合、プロバイダーは、以前に NDK_OP_FLAG_DEFER フラグを指定して送信されたすべての要求が、処理のためにハードウェアに示されることを保証する必要があります。
- コンシューマーは、インライン障害がない場合、 NDK_OP_FLAG_DEFER フラグを 設定しないイニシエーター要求によってすべてのイニシエーター要求チェーンが終了することを保証します。
たとえば、コンシューマーが 2 つの高速レジスタ要求のチェーンと、QP に投稿する必要がある送信がある場合を考えてみます。
- コンシューマーは、 NDK_OP_FLAG_DEFER フラグを持つ最初の高速レジスタをポストし、 NdkFastRegister はSTATUS_SUCCESSを返します。
- ここでも、2 番目の高速レジスタは NDK_OP_FLAG_DEFER フラグが設定された状態でポストされますが、 NdkFastRegister はエラー状態を返します。 この場合、コンシューマーは送信要求を投稿しません。
- NdkFastRegister への 2 回目の呼び出しでインライン エラーが返されると、NDK プロバイダーは、以前に送信されていないすべての要求 (この場合は最初の高速レジスタ) が処理のためにハードウェアに示されるようにします。
- NdkFastRegister の最初の呼び出しが成功したため、CQ に対して完了を生成する必要があります。
- NdkFastRegister への 2 回目の呼び出しはインラインで失敗したため、CQ に対して完了を生成することはできません。