static int run_test(void) { int ret, i; ret = sync_test(); if (ret) return ret; clock_gettime(CLOCK_MONOTONIC, &start); for (i = 0; i < opts.iterations; i++) { ret = opts.dst_addr ? send_xfer(opts.transfer_size) : recv_xfer(opts.transfer_size); if (ret) return ret; ret = opts.dst_addr ? recv_xfer(opts.transfer_size) : send_xfer(opts.transfer_size); if (ret) return ret; } clock_gettime(CLOCK_MONOTONIC, &end); if (opts.machr) show_perf_mr(opts.transfer_size, opts.iterations, &start, &end, 2, opts.argc, opts.argv); else show_perf(test_name, opts.transfer_size, opts.iterations, &start, &end, 2); return 0; }
static int run_test(void) { int ret, i, t; ret = sync_test(); if (ret) goto out; gettimeofday(&start, NULL); for (i = 0; i < iterations; i++) { for (t = 0; t < transfer_count; t++) { ret = dst_addr ? send_xfer(transfer_size) : recv_xfer(transfer_size); if (ret) goto out; } for (t = 0; t < transfer_count; t++) { ret = dst_addr ? recv_xfer(transfer_size) : send_xfer(transfer_size); if (ret) goto out; } } gettimeofday(&end, NULL); show_perf(); ret = 0; out: return ret; }
static int run_test(void) { int ret, i; ret = sync_test(); if (ret) goto out; clock_gettime(CLOCK_MONOTONIC, &start); for (i = 0; i < iterations; i++) { ret = dst_addr ? send_xfer(transfer_size) : recv_xfer(transfer_size); if (ret) goto out; ret = dst_addr ? recv_xfer(transfer_size) : send_xfer(transfer_size); if (ret) goto out; } clock_gettime(CLOCK_MONOTONIC, &end); show_perf(test_name, transfer_size, iterations, &start, &end, 2); ret = 0; out: return ret; }
static int sync_test(void) { int ret; ret = dst_addr ? send_xfer(16) : recv_xfer(16); if (ret) return ret; return dst_addr ? recv_xfer(16) : send_xfer(16); }
static int run_test(void) { int ret, i, t; off_t offset; uint8_t marker = 0; poll_byte = buf + transfer_size - 1; *poll_byte = -1; offset = riomap(rs, buf, transfer_size, PROT_WRITE, 0, 0); if (offset == -1) { perror("riomap"); ret = -1; goto out; } ret = sync_test(); if (ret) goto out; gettimeofday(&start, NULL); for (i = 0; i < iterations; i++) { if (dst_addr) { for (t = 0; t < transfer_count - 1; t++) { ret = send_xfer(transfer_size); if (ret) goto out; } *poll_byte = (uint8_t) marker++; ret = send_xfer(transfer_size); if (ret) goto out; ret = recv_xfer(transfer_size, marker++); } else { ret = recv_xfer(transfer_size, marker++); if (ret) goto out; for (t = 0; t < transfer_count - 1; t++) { ret = send_xfer(transfer_size); if (ret) goto out; } *poll_byte = (uint8_t) marker++; ret = send_xfer(transfer_size); } if (ret) goto out; } gettimeofday(&end, NULL); show_perf(); ret = riounmap(rs, buf, transfer_size); out: return ret; }
static int sync_test(void) { int ret; while (credits < max_credits) poll_all_sends(); ret = opts.dst_addr ? send_xfer(16) : recv_xfer(16); if (ret) return ret; return opts.dst_addr ? recv_xfer(16) : send_xfer(16); }
static int sync_test(void) { int ret; ret = wait_for_completion(scq, max_credits - credits); if (ret) { return ret; } credits = max_credits; ret = opts.dst_addr ? send_xfer(16) : recv_xfer(16); if (ret) return ret; return opts.dst_addr ? recv_xfer(16) : send_xfer(16); }
static int exchange_addr_key(void) { local.addr = (uintptr_t) buf; local.key = fi_mr_key(mr); if (opts.dst_addr) { *(struct fi_rma_iov *)buf = local; send_xfer(sizeof local); recv_xfer(sizeof remote); remote = *(struct fi_rma_iov *)buf; } else { recv_xfer(sizeof remote); remote = *(struct fi_rma_iov *)buf; *(struct fi_rma_iov *)buf = local; send_xfer(sizeof local); } return 0; }
static int sync_test(void) { int ret = 0; if (client) { *((uint64_t *)buf) = (uint64_t)buf; *((uint64_t *)buf + 1) = fi_mr_key(mr); if ((ret = send_xfer(sizeof(uint64_t)*2))) { return ret; } if ((ret = poll_all_sends())) { return ret; } if ((ret = recv_xfer(sizeof(uint64_t)*2))) { return ret; } if ((ret = poll_all_recvs())) { return ret; } rembuf = *((uint64_t *)buf); rkey = *((uint64_t *)buf + 1); } else { if ((ret = recv_xfer(sizeof(uint64_t)*2))) { return ret; } if ((ret = poll_all_recvs())) { return ret; } rembuf = *((uint64_t *)buf); rkey = *((uint64_t *)buf + 1); *((uint64_t *)buf) = (uint64_t)buf; *((uint64_t *)buf + 1) = fi_mr_key(mr); if ((ret = send_xfer(sizeof(uint64_t)*2))) { return ret; } if ((ret = poll_all_sends())) { return ret; } } return ret; }
static int server_connect(void) { int ret; struct fi_cq_entry comp; ret = common_setup(); if (ret != 0) goto err; do { ret = fi_cq_read(rcq, &comp, 1); if (ret < 0 && ret != -FI_EAGAIN) { FT_PRINTERR("fi_cq_read", ret); return ret; } } while (ret == -FI_EAGAIN); ret = fi_av_insert(av, buf_ptr, 1, &remote_fi_addr, 0, NULL); if (ret != 1) { if (ret == 0) { fprintf(stderr, "Unable to resolve remote address 0x%x 0x%x\n", ((uint32_t *)buf)[0], ((uint32_t *)buf)[1]); ret = -FI_EINVAL; } else { FT_PRINTERR("fi_av_insert", ret); } goto err; } ret = fi_recv(ep, buf, buffer_size, fi_mr_desc(mr), 0, buf); if (ret != 0) { FT_PRINTERR("fi_recv", ret); goto err; } ret = send_xfer(4); if (ret != 0) goto err; return 0; err: free_ep_res(); if (dom) fi_close(&dom->fid); if (fab) fi_close(&fab->fid); return ret; }
static int client_connect(void) { int ret; socklen_t addrlen; struct sockaddr *sin; ret = common_setup(); if (ret != 0) goto err; ret = getaddr(dst_addr, port, (struct sockaddr **) &sin, (socklen_t *) &addrlen); if (ret != 0) goto err; ret = fi_connect(ep, sin, NULL, 0); if (ret) { printf("fi_connect %s\n", fi_strerror(-ret)); goto err; } // send initial message to server ret = send_xfer(4); if (ret != 0) goto err; // wait for reply to know server is ready ret = recv_xfer(4); if (ret != 0) goto err; return 0; err: free_ep_res(); fi_close(&av->fid); fi_close(&ep->fid); fi_close(&dom->fid); fi_close(&fab->fid); return ret; }
static int client_connect(void) { int ret; ret = common_setup(); if (ret != 0) return ret; ret = ft_getdestaddr(opts.dst_addr, opts.dst_port, hints); if (ret != 0) goto err1; ret = fi_av_insert(av, hints->dest_addr, 1, &remote_fi_addr, 0, NULL); if (ret != 1) { FT_PRINTERR("fi_av_insert", ret); goto err2; } // send initial message to server with our local address memcpy(buf_ptr, fi->src_addr, fi->src_addrlen); ret = send_xfer(fi->src_addrlen); if (ret != 0) goto err2; // wait for reply to know server is ready ret = recv_xfer(4); if (ret != 0) goto err2; return 0; err2: free(hints->dest_addr); err1: free_ep_res(); fi_close(&av->fid); fi_close(&dom->fid); fi_close(&fab->fid); return ret; }
static int server_connect(void) { int ret; struct fi_cq_entry comp; ret = common_setup(); if (ret != 0) goto err; do { ret = fi_cq_readfrom(rcq, &comp, sizeof comp, &client_addr); if (ret < 0) { printf("RCQ readfrom %d (%s)\n", ret, fi_strerror(-ret)); return ret; } } while (ret == 0); if (client_addr == FI_ADDR_NOTAVAIL) { printf("Error getting address\n"); goto err; } ret = fi_recv(ep, buf, buffer_size, fi_mr_desc(mr), buf); if (ret != 0) { printf("fi_recv %d (%s)\n", ret, fi_strerror(-ret)); goto err; } ret = send_xfer(4); if (ret != 0) goto err; return 0; err: free_ep_res(); fi_close(&ep->fid); fi_close(&dom->fid); fi_close(&fab->fid); return ret; }
static int init_av(void) { int ret; if (opts.dst_addr) { /* Get local address blob. Find the addrlen first. We set addrlen * as 0 and fi_getname will return the actual addrlen. */ addrlen = 0; ret = fi_getname(&ep->fid, local_addr, &addrlen); if (ret != -FI_ETOOSMALL) { FT_PRINTERR("fi_getname", ret); return ret; } local_addr = malloc(addrlen); ret = fi_getname(&ep->fid, local_addr, &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } ret = fi_av_insert(av, remote_addr, 1, &remote_fi_addr, 0, &fi_ctx_av); if (ret != 1) { FT_PRINTERR("fi_av_insert", ret); return ret; } /* Send local addr size and local addr */ memcpy(tx_buf, &addrlen, sizeof(size_t)); memcpy(tx_buf + sizeof(size_t), local_addr, addrlen); ret = send_xfer(sizeof(size_t) + addrlen); if (ret) return ret; /* Receive ACK from server */ ret = recv_msg(); if (ret) return ret; } else { /* Post a recv to get the remote address */ ret = recv_msg(); if (ret) return ret; memcpy(&addrlen, rx_buf, sizeof(size_t)); remote_addr = malloc(addrlen); memcpy(remote_addr, rx_buf + sizeof(size_t), addrlen); ret = fi_av_insert(av, remote_addr, 1, &remote_fi_addr, 0, &fi_ctx_av); if (ret != 1) { FT_PRINTERR("fi_av_insert", ret); return ret; } /* Send ACK */ ret = send_xfer(16); if (ret) return ret; } /* Post first recv */ ret = fi_recv(ep, rx_buf, rx_size, fi_mr_desc(mr), remote_fi_addr, &fi_ctx_recv); if (ret) FT_PRINTERR("fi_recv", ret); return ret; }