Provided by: libfabric-dev_1.6.2-3ubuntu0.1_amd64 

NAME
fabric - Fabric Interface Library
SYNOPSIS
#include <rdma/fabric.h>
Libfabric is a high-performance fabric software library designed to provide low-latency interfaces to
fabric hardware.
OVERVIEW
Libfabric provides 'process direct I/O' to application software communicating across fabric software and
hardware. Process direct I/O, historically referred to as RDMA, allows an application to directly access
network resources without operating system interventions. Data transfers can occur directly to and from
application memory.
There are two components to the libfabric software:
Fabric Providers : Conceptually, a fabric provider may be viewed as a local hardware NIC driver, though a
provider is not limited by this definition. The first component of libfabric is a general purpose
framework that is capable of handling different types of fabric hardware. All fabric hardware devices
and their software drivers are required to support this framework. Devices and the drivers that plug
into the libfabric framework are referred to as fabric providers, or simply providers. Provider details
may be found in fi_provider(7).
Fabric Interfaces : The second component is a set of communication operations. Libfabric defines several
sets of communication functions that providers can support. It is not required that providers implement
all the interfaces that are defined; however, providers clearly indicate which interfaces they do
support.
FABRIC INTERFACES
The fabric interfaces are designed such that they are cohesive and not simply a union of disjoint
interfaces. The interfaces are logically divided into two groups: control interfaces and communication
operations. The control interfaces are a common set of operations that provide access to local
communication resources, such as address vectors and event queues. The communication operations expose
particular models of communication and fabric functionality, such as message queues, remote memory
access, and atomic operations. Communication operations are associated with fabric endpoints.
Applications will typically use the control interfaces to discover local capabilities and allocate
necessary resources. They will then allocate and configure a communication endpoint to send and receive
data, or perform other types of data transfers, with remote endpoints.
CONTROL INTERFACES
The control interfaces APIs provide applications access to network resources. This involves listing all
the interfaces available, obtaining the capabilities of the interfaces and opening a provider.
fi_getinfo - Fabric Information : The fi_getinfo call is the base call used to discover and request
fabric services offered by the system. Applications can use this call to indicate the type of
communication that they desire. The results from fi_getinfo, fi_info, are used to reserve and configure
fabric resources.
fi_getinfo returns a list of fi_info structures. Each structure references a single fabric provider,
indicating the interfaces that the provider supports, along with a named set of resources. A fabric
provider may include multiple fi_info structures in the returned list.
fi_fabric - Fabric Domain : A fabric domain represents a collection of hardware and software resources
that access a single physical or virtual network. All network ports on a system that can communicate
with each other through the fabric belong to the same fabric domain. A fabric domain shares network
addresses and can span multiple providers. libfabric supports systems connected to multiple fabrics.
fi_domain - Access Domains : An access domain represents a single logical connection into a fabric. It
may map to a single physical or virtual NIC or a port. An access domain defines the boundary across
which fabric resources may be associated. Each access domain belongs to a single fabric domain.
fi_endpoint - Fabric Endpoint : A fabric endpoint is a communication portal. An endpoint may be either
active or passive. Passive endpoints are used to listen for connection requests. Active endpoints can
perform data transfers. Endpoints are configured with specific communication capabilities and data
transfer interfaces.
fi_eq - Event Queue : Event queues, are used to collect and report the completion of asynchronous
operations and events. Event queues report events that are not directly associated with data transfer
operations.
fi_cq - Completion Queue : Completion queues are high-performance event queues used to report the
completion of data transfer operations.
fi_cntr - Event Counters : Event counters are used to report the number of completed asynchronous
operations. Event counters are considered light-weight, in that a completion simply increments a
counter, rather than placing an entry into an event queue.
fi_mr - Memory Region : Memory regions describe application local memory buffers. In order for fabric
resources to access application memory, the application must first grant permission to the fabric
provider by constructing a memory region. Memory regions are required for specific types of data
transfer operations, such as RMA transfers (see below).
fi_av - Address Vector : Address vectors are used to map higher level addresses, such as IP addresses,
which may be more natural for an application to use, into fabric specific addresses. The use of address
vectors allows providers to reduce the amount of memory required to maintain large address look-up
tables, and eliminate expensive address resolution and look-up methods during data transfer operations.
DATA TRANSFER INTERFACES
Fabric endpoints are associated with multiple data transfer interfaces. Each interface set is designed
to support a specific style of communication, with an endpoint allowing the different interfaces to be
used in conjunction. The following data transfer interfaces are defined by libfabric.
fi_msg - Message Queue : Message queues expose a simple, message-based FIFO queue interface to the
application. Message data transfers allow applications to send and receive data with message boundaries
being maintained.
fi_tagged - Tagged Message Queues : Tagged message lists expose send/receive data transfer operations
built on the concept of tagged messaging. The tagged message queue is conceptually similar to standard
message queues, but with the addition of 64-bit tags for each message. Sent messages are matched with
receive buffers that are tagged with a similar value.
fi_rma - Remote Memory Access : RMA transfers are one-sided operations that read or write data directly
to a remote memory region. Other than defining the appropriate memory region, RMA operations do not
require interaction at the target side for the data transfer to complete.
fi_atomic - Atomic : Atomic operations can perform one of several operations on a remote memory region.
Atomic operations include well-known functionality, such as atomic-add and compare-and-swap, plus several
other pre-defined calls. Unlike other data transfer interfaces, atomic operations are aware of the data
formatting at the target memory region.
LOGGING INTERFACE
Logging can be controlled using the FI_LOG_LEVEL, FI_LOG_PROV, and FI_LOG_SUBSYS environment variables.
FI_LOG_LEVEL : FI_LOG_LEVEL controls the amount of logging data that is output. The following log levels
are defined.
• Warn : Warn is the least verbose setting and is intended for reporting errors or warnings.
• Trace : Trace is more verbose and is meant to include non-detailed output helpful to tracing program
execution.
• Info : Info is high traffic and meant for detailed output.
• Debug : Debug is high traffic and is likely to impact application performance. Debug output is only
available if the library has been compiled with debugging enabled.
FI_LOG_PROV : The FI_LOG_PROV environment variable enables or disables logging from specific providers.
Providers can be enabled by listing them in a comma separated fashion. If the list begins with the '^'
symbol, then the list will be negated. By default all providers are enabled.
Example: To enable logging from the psm and sockets provider: FI_LOG_PROV="psm,sockets"
Example: To enable logging from providers other than psm: FI_LOG_PROV="^psm"
FI_LOG_SUBSYS : The FI_LOG_SUBSYS environment variable enables or disables logging at the subsystem
level. The syntax for enabling or disabling subsystems is similar to that used for FI_LOG_PROV. The
following subsystems are defined.
• core : Provides output related to the core framework and its management of providers.
• fabric : Provides output specific to interactions associated with the fabric object.
• domain : Provides output specific to interactions associated with the domain object.
• ep_ctrl : Provides output specific to endpoint non-data transfer operations, such as CM operations.
• ep_data : Provides output specific to endpoint data transfer operations.
• av : Provides output specific to address vector operations.
• cq : Provides output specific to completion queue operations.
• eq : Provides output specific to event queue operations.
• mr : Provides output specific to memory registration.
NOTES
Because libfabric is designed to provide applications direct access to fabric hardware, there are limits
on how libfabric resources may be used in conjunction with system calls. These limitations are notable
for developers who may be familiar programming to the sockets interface. Although limits are provider
specific, the following restrictions apply to many providers and should be adhered to by applications
desiring portability across providers.
fork : Fabric resources are not guaranteed to be available by child processes. This includes objects,
such as endpoints and completion queues, as well as application controlled data buffers which have been
assigned to the network. For example, data buffers that have been registered with a fabric domain may
not be available in a child process because of copy on write restrictions.
SEE ALSO
fi_provider(7), fi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_av(3), fi_eq(3), fi_cq(3), fi_cntr(3),
fi_mr(3)
AUTHORS
OpenFabrics.
Libfabric Programmer's Manual 2017-12-01 fabric(7)