fabric : Fabric provider
domain : Resource domain
pollset : Event poll set
waitset : Wait object set
attr : Poll or wait set attributes
context : On success, an array of user context values
associated with completion queues or counters.
fids : An array of fabric descriptors, each one associated
with a native wait object.
count : Number of entries in context or fids array.
timeout : Time to wait for a signal, in milliseconds.
command : Command of control operation to perform on the
wait set.
arg : Optional control argument.
fi_poll_open creates a new polling set. A poll set enables an
optimized method for progressing asynchronous operations across multiple
completion queues and counters and checking for their completions.
A poll set is defined with the following attributes.
-
struct fi_poll_attr {
uint64_t flags; /* operation flags */
};
flags : Flags that set the default operation of the poll
set. The use of this field is reserved and must be set to 0 by the
caller.
The fi_close call releases all resources associated with a poll
set. The poll set must not be associated with any other resources prior to
being closed, otherwise the call will return -FI_EBUSY.
Associates a completion queue or counter with a poll set.
Removes a completion queue or counter from a poll set.
Progresses all completion queues and counters associated with a
poll set and checks for events. If events might have occurred, contexts
associated with the completion queues and/or counters are returned.
Completion queues will return their context if they are not empty. The
context associated with a counter will be returned if the counter's success
value or error value have changed since the last time fi_poll, fi_cntr_set,
or fi_cntr_add were called. The number of contexts is limited to the size of
the context array, indicated by the count parameter.
Note that fi_poll only indicates that events might be available.
In some cases, providers may consume such events internally, to drive
progress, for example. This can result in fi_poll returning false positives.
Applications should drive their progress based on the results of reading
events from a completion queue or reading counter values. The fi_poll
function will always return all completion queues and counters that do have
new events.
fi_wait_open allocates a new wait set. A wait set enables an
optimized method of waiting for events across multiple completion queues and
counters. Where possible, a wait set uses a single underlying wait object
that is signaled when a specified condition occurs on an associated
completion queue or counter.
The properties and behavior of a wait set are defined by struct
fi_wait_attr.
-
struct fi_wait_attr {
enum fi_wait_obj wait_obj; /* requested wait object */
uint64_t flags; /* operation flags */
};
wait_obj : Wait sets are associated with specific wait
object(s). Wait objects allow applications to block until the wait object is
signaled, indicating that an event is available to be read. The following
values may be used to specify the type of wait object associated with a wait
set: FI_WAIT_UNSPEC, FI_WAIT_FD, and FI_WAIT_MUTEX_COND.
- FI_WAIT_UNSPEC : Specifies that the user will only wait on the wait
set using fabric interface calls, such as fi_wait. In this case, the
underlying provider may select the most appropriate or highest performing
wait object available, including custom wait mechanisms. Applications that
select FI_WAIT_UNSPEC are not guaranteed to retrieve the underlying wait
object.
- FI_WAIT_FD : Indicates that the wait set should use file
descriptor(s) as its wait mechanism. It may not always be possible for a
wait set to be implemented using a single underlying file descriptor, but
all wait objects will be file descriptors. File descriptor wait objects
must be usable in the POSIX select(2), poll(2), and epoll(7) routines (if
available). However, a provider may signal an FD wait object by marking it
as readable or with an error.
- FI_WAIT_MUTEX_COND : Specifies that the wait set should use a
pthread mutex and cond variable as a wait object.
- FI_WAIT_CRITSEC_COND : Windows specific. Specifies that the EQ
should use a critical section and condition variable as a wait
object.
flags : Flags that set the default operation of the wait
set. The use of this field is reserved and must be set to 0 by the
caller.
The fi_close call releases all resources associated with a wait
set. The wait set must not be bound to any other opened resources prior to
being closed, otherwise the call will return -FI_EBUSY.
Waits on a wait set until one or more of its underlying wait
objects is signaled.
The fi_trywait call was introduced in libfabric version 1.3. The
behavior of using native wait objects without the use of fi_trywait is
provider specific and should be considered non-deterministic.
The fi_trywait() call is used in conjunction with native operating
system calls to block on wait objects, such as file descriptors. The
application must call fi_trywait and obtain a return value of FI_SUCCESS
prior to blocking on a native wait object. Failure to do so may result in
the wait object not being signaled, and the application not observing the
desired events. The following pseudo-code demonstrates the use of fi_trywait
in conjunction with the OS select(2) call.
-
fi_control(&cq->fid, FI_GETWAIT, (void *) &fd);
FD_ZERO(&fds);
FD_SET(fd, &fds);
while (1) {
if (fi_trywait(&cq, 1) == FI_SUCCESS)
select(fd + 1, &fds, NULL, &fds, &timeout);
do {
ret = fi_cq_read(cq, &comp, 1);
} while (ret > 0);
}
fi_trywait() will return FI_SUCCESS if it is safe to block on the
wait object(s) corresponding to the fabric descriptor(s), or -FI_EAGAIN if
there are events queued on the fabric descriptor or if blocking could hang
the application.
The call takes an array of fabric descriptors. For each wait
object that will be passed to the native wait routine, the corresponding
fabric descriptor should first be passed to fi_trywait. All fabric
descriptors passed into a single fi_trywait call must make use of the same
underlying wait object type.
The following types of fabric descriptors may be passed into
fi_trywait: event queues, completion queues, counters, and wait sets.
Applications that wish to use native wait calls should select specific wait
objects when allocating such resources. For example, by setting the item's
creation attribute wait_obj value to FI_WAIT_FD.
In the case the wait object to check belongs to a wait set, only
the wait set itself needs to be passed into fi_trywait. The fabric resources
associated with the wait set do not.
On receiving a return value of -FI_EAGAIN from fi_trywait, an
application should read all queued completions and events, and call
fi_trywait again before attempting to block. Applications can make use of a
fabric poll set to identify completion queues and counters that may require
processing.
The fi_control call is used to access provider or implementation
specific details of the wait set. Access to the wait set should be
serialized across all calls when fi_control is invoked, as it may redirect
the implementation of wait set operations. The following control commands
are usable with a wait set.
FI_GETWAIT (void **) : This command allows the user to
retrieve the low-level wait object associated with the wait set. The format
of the wait set is specified during wait set creation, through the wait set
attributes. The fi_control arg parameter should be an address where a
pointer to the returned wait object will be written. This should be an 'int
*' for FI_WAIT_FD, or 'struct fi_mutex_cond' for FI_WAIT_MUTEX_COND. Support
for FI_GETWAIT is provider specific and may fail if not supported or if the
wait set is implemented using more than one wait object.