#ifndef UCP_ADDRESS_H_
#define UCP_ADDRESS_H_
#include <uct/api/uct.h>
#include <ucp/core/ucp_context.h>
#include <ucp/core/ucp_worker.h>
#include <ucs/sys/math.h>
#define UCP_ADDRESS_IFACE_SEG_SIZE_FACTOR 64
enum {
UCP_ADDRESS_IFACE_FLAGS =
UCT_IFACE_FLAG_CONNECT_TO_IFACE |
UCT_IFACE_FLAG_CB_SYNC |
UCT_IFACE_FLAG_CB_ASYNC |
UCT_IFACE_FLAG_AM_BCOPY |
UCT_IFACE_FLAG_PUT_SHORT |
UCT_IFACE_FLAG_PUT_BCOPY |
UCT_IFACE_FLAG_PUT_ZCOPY |
UCT_IFACE_FLAG_GET_SHORT |
UCT_IFACE_FLAG_GET_BCOPY |
UCT_IFACE_FLAG_GET_ZCOPY |
UCT_IFACE_FLAG_TAG_EAGER_BCOPY |
UCT_IFACE_FLAG_TAG_RNDV_ZCOPY |
UCT_IFACE_FLAG_PENDING
};
enum {
UCP_ADDR_IFACE_FLAG_CONNECT_TO_IFACE = UCS_BIT(0),
UCP_ADDR_IFACE_FLAG_AM_SYNC = UCS_BIT(1),
UCP_ADDR_IFACE_FLAG_CB_ASYNC = UCS_BIT(2),
UCP_ADDR_IFACE_FLAG_PUT = UCS_BIT(3),
UCP_ADDR_IFACE_FLAG_GET = UCS_BIT(4),
UCP_ADDR_IFACE_FLAG_TAG_EAGER = UCS_BIT(5),
UCP_ADDR_IFACE_FLAG_TAG_RNDV = UCS_BIT(6),
UCP_ADDR_IFACE_FLAG_EVENT_RECV = UCS_BIT(7),
UCP_ADDR_IFACE_FLAG_ATOMIC32 = UCS_BIT(8),
UCP_ADDR_IFACE_FLAG_ATOMIC64 = UCS_BIT(9)
};
enum {
UCP_ADDRESS_IFACE_EVENT_FLAGS = UCT_IFACE_FLAG_EVENT_RECV
};
enum {
UCP_ADDRESS_PACK_FLAG_WORKER_UUID = UCS_BIT(0),
UCP_ADDRESS_PACK_FLAG_WORKER_NAME = UCS_BIT(1),
UCP_ADDRESS_PACK_FLAG_DEVICE_ADDR = UCS_BIT(2),
UCP_ADDRESS_PACK_FLAG_IFACE_ADDR = UCS_BIT(3),
UCP_ADDRESS_PACK_FLAG_EP_ADDR = UCS_BIT(4),
UCP_ADDRESS_PACK_FLAG_TL_RSC_IDX = UCS_BIT(5),
UCP_ADDRESS_PACK_FLAG_SYS_DEVICE = UCS_BIT(6),
UCP_ADDRESS_PACK_FLAG_CLIENT_ID = UCS_BIT(7),
UCP_ADDRESS_PACK_FLAG_AM_ONLY = UCS_BIT(8),
UCP_ADDRESS_PACK_FLAG_LAST,
UCP_ADDRESS_PACK_FLAGS_ALL = (UCP_ADDRESS_PACK_FLAG_LAST << 1) - 3,
UCP_ADDRESS_PACK_FLAGS_CM_DEFAULT = UCP_ADDRESS_PACK_FLAG_IFACE_ADDR |
UCP_ADDRESS_PACK_FLAG_EP_ADDR,
UCP_ADDRESS_PACK_FLAG_NO_TRACE = UCS_BIT(16)
};
typedef ucs_bitmap_t(UCP_MAX_RESOURCES) ucp_tl_addr_bitmap_t;
struct ucp_address_iface_attr {
uint64_t flags;
double overhead;
double bandwidth;
int priority;
double lat_ovh;
ucp_rsc_index_t dst_rsc_index;
ucp_tl_iface_atomic_flags_t atomic;
size_t seg_size;
ucp_object_version_t addr_version;
};
typedef struct ucp_address_entry_ep_addr {
ucp_lane_index_t lane;
const uct_ep_addr_t *addr;
} ucp_address_entry_ep_addr_t;
struct ucp_address_entry {
const uct_device_addr_t *dev_addr;
const uct_iface_addr_t *iface_addr;
unsigned num_ep_addrs;
ucp_address_entry_ep_addr_t ep_addrs[UCP_MAX_LANES];
ucp_address_iface_attr_t iface_attr;
unsigned dev_num_paths;
uint16_t tl_name_csum;
ucp_md_index_t md_index;
ucs_sys_device_t sys_dev;
ucp_rsc_index_t dev_index;
};
struct ucp_unpacked_address {
uint64_t uuid;
char name[UCP_WORKER_ADDRESS_NAME_MAX];
unsigned address_count;
ucp_address_entry_t *address_list;
};
#define ucp_unpacked_address_for_each(_elem, _unpacked_address) \
for (_elem = (_unpacked_address)->address_list; \
_elem < (_unpacked_address)->address_list + (_unpacked_address)->address_count; \
++_elem)
#define ucp_unpacked_address_index(_unpacked_address, _ae) \
((int)((_ae) - (_unpacked_address)->address_list))
ucs_status_t ucp_address_pack(ucp_worker_h worker, ucp_ep_h ep,
const ucp_tl_bitmap_t *tl_bitmap,
unsigned pack_flags,
ucp_object_version_t addr_version,
const ucp_lane_index_t *lanes2remote,
size_t *size_p, void **buffer_p);
ucs_status_t ucp_address_unpack(ucp_worker_h worker, const void *buffer,
unsigned unpack_flags,
ucp_unpacked_address_t *unpacked_address);
uint64_t ucp_address_get_uuid(const void *address);
uint64_t ucp_address_get_client_id(const void *address);
uint8_t ucp_address_is_am_only(const void *address);
size_t ucp_address_iface_seg_size(const uct_iface_attr_t *iface_attr);
#endif