[ofiwg] A question on FI_DELIVERY_COMPLETE
Hefty, Sean
sean.hefty at intel.com
Mon Oct 26 16:40:44 PDT 2015
> FI_DELIVERY_COMPLETE is intended only to apply to the initiator of an
> operation.
> [PG] I suspected as much.
>
> The generation of a notification at the target is assumed to occur after
> the operation has completed -- i.e. any transferred data is available.
> This holds whether the completion is an entry placed into a CQ, or a
> completion counter has been incremented.
>
> [PG] Using one of today's well-known networks as an example, there is no
> way to guarantee that data is actually visible to the responder before
> posting a completion to the CQ. I assume that for backward compatibility
> reasons we would want to maintain that behavior. That implies that it
> would be desirable to define some other behavior in which the responder
> side provider, through some internal mechanism, guarantees that the data
> is visible to the consumer before signaling the completion to the consumer
> (whether it is via a completion event or a counter increment). It would
> be the moral equivalent of FI_DELIVERY_COMPLETE, but on the responder
> side.
Which CQ are you referring to? If a completion is written at the target, then the data associated with it better be visible to the target process. Otherwise the completion is meaningless. Consider a CQ entry for a received message.
> The FI_REMOTE_CQ_DATA flag is somewhat independent of this. That flag
> just means that application data was written into a CQ entry.
> [PG] I don't quite understand this. As I read it, remote cq data is the
> moral equivalent of immediate data, and FI_REMOTE_CQ_DATA is the mechanism
> that causes the requester to send immediate data. The presence of this
> Remote CQ Data, in turn, causes a completion event on the remote side,
> which might be either an event posted to the completion queue, or the
> increment of a counter. (In the case of IB, it also causes the consumption
> of a RECV WQE, but that isn't the case with libfabric.)
Nit: FI_REMOTE_CQ_DATA only applies to CQ entries, not counters.
With libfabric, the use of FI_REMOTE_CQ_DATA is not required in order to generate a completion at the target. E.g. a RMA write operation can increment a completion counter or generate a CQ entry at the target without remote CQ data present. Similarly, an RMA read operation can increment a completion counter or generate a CQ entry. *If* FI_REMOTE_CQ_DATA is present, then a CQ entry will always be generated at the target for a successful operation. This is the behavior that applications requested.
> Although IB cannot generate target notification without FI_REMOTE_CQ_DATA
> (i.e. immediate data), libfabric does not require this.
> [PG] Other than a subsequent send message, how can libfabric generate a
> notification on the target side other than using FI_REMOTE_CQ_DATA?
This is provider specific. But there's nothing special about generating a CQ entry. I can't think of any reason why IB hardware couldn't easily be adapted to generate a CQ entry in response to receiving an RMA write operation (without immediate data), for example, other than the spec doesn't define it.
> The generation of a completion entry at the target is independent of the
> completion mode selected by the initiator.
> [PG] Agreed. I am suggesting a mechanism that controls the generation of
> a completion entry at the responder side.
The target side controls whether a completion entry is generated through the use of completion flags (e.g. FI_REMOTE_WRITE, FI_REMOTE_READ) when binding a CQ or counter to an endpoint. There are not the same level of 'completion modes' on the target side as there are at the initiator. A completion entry indicates that the operation is done. There is no notification for operations that are in progress.
- Sean
More information about the ofiwg
mailing list