8. Usage Patterns#
8.1. Basic Server Usage#
cuObjServer server("192.168.1.100", 18515, CUOBJ_PROTO_RDMA_DC_V1);
if (!server.isConnected()) {
return;
}
uint16_t channel = server.allocateChannelId();
if (channel == INVALID_CHANNEL_ID) {
return;
}
void* buffer = server.allocHostBuffer(1024 * 1024);
if (buffer == nullptr) {
server.freeChannelId(channel);
return;
}
struct rdma_buffer* rdma_buf = server.registerBuffer(buffer, 1024 * 1024);
if (rdma_buf == nullptr) {
free(buffer);
server.freeChannelId(channel);
return;
}
ssize_t result = server.handleGetObject("request-1",
rdma_buf,
remote_addr,
request_size,
rdma_descriptor,
channel);
if (result < 0) {
// Handle error.
}
server.deRegisterBuffer(rdma_buf);
free(buffer);
server.freeChannelId(channel);
8.2. Synchronous PUT Usage#
ssize_t result = server.handlePutObject("request-2",
rdma_buf,
remote_addr,
request_size,
rdma_descriptor,
channel);
if (result > 0) {
// result bytes are available in rdma_buf-backed local memory.
}
8.3. Asynchronous Usage#
void* async_handle = reinterpret_cast<void*>(0x1);
ssize_t submit = server.handleGetObject("async-get",
rdma_buf,
remote_addr,
request_size,
rdma_descriptor,
channel,
0,
nullptr,
async_handle);
if (submit == 0) {
cuObjAsyncEvent_t events[16];
int count = 0;
do {
count = server.poll(events, 16, channel);
} while (count == 0);
if (count > 0) {
for (int i = 0; i < count; ++i) {
if (events[i].status == IBV_WC_SUCCESS) {
// events[i].async_handle identifies the completed request.
}
}
}
}
8.4. Scatter-Gather Registration#
void* buf1 = server.allocHostBuffer(4096);
void* buf2 = server.allocHostBuffer(8192);
std::vector<cuObjScatterGatherEntry_t> sglist = {
{ buf1, 4096 },
{ buf2, 8192 }
};
struct rdma_buffer* rdma_buf = server.registerBuffer(sglist);
if (rdma_buf != nullptr) {
ssize_t result = server.handleGetObject("sg-get",
rdma_buf,
remote_addr,
12288,
rdma_descriptor,
channel);
server.deRegisterBuffer(rdma_buf);
}
free(buf1);
free(buf2);
8.5. Registered Buffer View#
void* base = server.allocHostBuffer(1024 * 1024);
struct rdma_buffer* base_buf = server.registerBuffer(base, 1024 * 1024);
std::vector<cuObjScatterGatherEntryWithOffset_t> view_entries = {
{ 0, 4096 },
{ 16384, 8192 }
};
struct rdma_buffer* view =
server.getRDMABufferFromSgList(base_buf, view_entries);
if (view != nullptr) {
server.handleGetObject("view-get",
view,
remote_addr,
12288,
rdma_descriptor,
channel);
server.putRDMABufferFromSgList(view);
}
server.deRegisterBuffer(base_buf);
free(base);
8.6. Custom RDMA Tuning#
cuObjRDMATunable params;
params.setNumDcis(256);
params.setCqDepth(1024);
params.setTimeout(20);
params.setRetryCount(7);
params.setDelayInterval(10000);
params.setQPResetOnFailure(true);
params.setMaxRdAtomic(16);
cuObjServer server("fd00::10", 18515, CUOBJ_PROTO_RDMA_DC_V1, params);
8.7. Telemetry Configuration#
std::ofstream log_file("cuobj_server.log");
cuObjServer::setupTelemetry(false, &log_file);
cuObjServer::setTelemFlags(CUOBJ_LOG_PATH_ERROR |
CUOBJ_LOG_PATH_INFO |
CUOBJ_LOG_PATH_DEBUG);
{
cuObjServer server("192.168.1.100", 18515, CUOBJ_PROTO_RDMA_DC_V1);
// Use server.
}
cuObjServer::shutdownTelemetry();
log_file.close();