static int delay = 0;
static int buf_len = RDMA_BUFFER_SIZE;
static int use_cno = 0;
+static int open_query = 0;
+static int open_query_ext = 0;
static int recv_msg_index = 0;
static int burst_msg_posted = 0;
static int burst_msg_index = 0;
static int ucm = 0;
static int write_only = 1; /* only test rdma_writes by default */
-static int query_only = 0;
static int rq_cnt, sq_cnt;
static DAT_SOCK_ADDR6 remote;
}
}
+#define MAX_PROV 64
+double openq_avg[MAX_PROV];
+double openq_max[MAX_PROV];
+double openq_min[MAX_PROV];
+double open_avg[MAX_PROV];
+double open_max[MAX_PROV];
+double open_min[MAX_PROV];
+double closeq_avg[MAX_PROV];
+double closeq_max[MAX_PROV];
+double closeq_min[MAX_PROV];
+double close_avg[MAX_PROV];
+double close_max[MAX_PROV];
+double close_min[MAX_PROV];
+double query_avg[MAX_PROV];
+double query_max[MAX_PROV];
+double query_min[MAX_PROV];
+DAT_PROVIDER_INFO **p_list;
+DAT_IA_HANDLE p_ia_query[MAX_PROV];
+DAT_IA_HANDLE p_ia[MAX_PROV];
+DAT_EVD_HANDLE p_evd[MAX_PROV];
+DAT_IA_ATTR p_ia_attr[MAX_PROV];
+DAT_PROVIDER_ATTR p_pr_attr[MAX_PROV];
+
+static void dt_profile(double *avg, double *min, double *max, double start, double stop)
+{
+ double diff = ((stop - start) * 1.0e6); /* usec */
+
+ if (*min == 0 || diff < *min)
+ *min = diff;
+ if (*max == 0 || diff > *max)
+ *max = diff;
+ if (*avg == 0)
+ *avg = diff;
+ else
+ *avg = (diff + *avg)/2;
+}
+
+static void dt_memset(int val)
+{
+ memset(openq_avg, val, MAX_PROV * sizeof(double));
+ memset(openq_max, val, MAX_PROV * sizeof(double));
+ memset(openq_min, val, MAX_PROV * sizeof(double));
+ memset(open_avg, val, MAX_PROV * sizeof(double));
+ memset(open_max, val, MAX_PROV * sizeof(double));
+ memset(open_min, val, MAX_PROV * sizeof(double));
+ memset(closeq_avg, val, MAX_PROV * sizeof(double));
+ memset(closeq_max, val, MAX_PROV * sizeof(double));
+ memset(closeq_min, val, MAX_PROV * sizeof(double));
+ memset(close_avg, val, MAX_PROV * sizeof(double));
+ memset(close_max, val, MAX_PROV * sizeof(double));
+ memset(close_min, val, MAX_PROV * sizeof(double));
+ memset(query_avg, val, MAX_PROV * sizeof(double));
+ memset(query_max, val, MAX_PROV * sizeof(double));
+ memset(query_min, val, MAX_PROV * sizeof(double));
+}
+
+static void prof_query_providers(int iters)
+{
+ DAT_RETURN ret;
+ int i, ii, it, p_cnt = 0;
+ double tt_start, tt_stop;
+ double ttq_start, ttq_stop;
+
+ dt_memset(0); /* init query timers */
+ tt_start = tt_stop = ttq_start = ttq_stop = 0;
+
+ /* array of pointers for info */
+ p_list = malloc(MAX_PROV * sizeof(DAT_PROVIDER_INFO *));
+ if (p_list == NULL)
+ return;
+
+ memset(p_list, 0, MAX_PROV * sizeof(DAT_PROVIDER_INFO *));
+ for (i = 0; i < MAX_PROV; i++ ) {
+ p_list[i] = malloc(sizeof(DAT_PROVIDER_INFO));
+ if (p_list[i] == NULL)
+ goto bail;
+ }
+
+ /* get complete list of providers */
+ ret = dat_registry_list_providers(MAX_PROV, &p_cnt, p_list);
+ if (ret != DAT_SUCCESS) {
+ fprintf(stderr, "ERR list_prov: %s\n", DT_RetToStr(ret));
+ exit(1);
+ } else
+ LOGPRINTF("list_providers %d entries\n", p_cnt);
+
+ if (!open_query_ext)
+ goto skip;
+
+ /* NEW extension - query_by_name */
+ ttq_start = get_time();
+ for (i=0;i<p_cnt;i++) {
+ for (it=0;it<iters;it++) {
+ LOGPRINTF("open_query[%d][%d] - %s\n",
+ i, it, p_list[i]->ia_name);
+ start = get_time();
+ ret = dat_ib_open_query(p_list[i]->ia_name,
+ &p_ia_query[i],
+ DAT_IA_FIELD_ALL, &p_ia_attr[i],
+ DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR,
+ &p_pr_attr[i]);
+ stop = get_time();
+ dt_profile(&openq_avg[i], &openq_min[i], &openq_max[i], start, stop);
+ if (ret != DAT_SUCCESS) {
+ LOGPRINTF("ERR open_query: %s on %s[%d][%d]\n",
+ DT_RetToStr(ret),
+ p_list[i]->ia_name, i, it);
+ continue;
+ } else
+ LOGPRINTF("open_query return - %s num_pr %d, ia %p\n",
+ p_list[i]->ia_name,
+ p_pr_attr[i].num_provider_specific_attr,
+ p_ia_query[i]);
+
+ /* Provider specific attributes */
+ for (ii=0; ii<p_pr_attr[i].num_provider_specific_attr; ii++) {
+ LOGPRINTF("Provider_attr[%d] %s = %s VER: hw %d ext %d \n",
+ ii,
+ p_pr_attr[i].provider_specific_attr[ii].name,
+ p_pr_attr[i].provider_specific_attr[ii].value,
+ p_ia_attr[i].hardware_version_major,
+ p_ia_attr[i].extension_version);
+ }
+ if (verbose)
+ print_ia_address(ia_attr.ia_address_ptr);
+
+ LOGPRINTF("close_query[%d] - %s ia %p\n",
+ i, p_list[i]->ia_name, p_ia_query[i]);
+ start = get_time();
+ ret = dat_ib_close_query(p_ia_query[i]);
+ stop = get_time();
+ dt_profile(&closeq_avg[i], &closeq_min[i], &closeq_max[i], start, stop);
+ if (ret != DAT_SUCCESS) {
+ fprintf(stderr, "ERR close_query: %s\n", DT_RetToStr(ret));
+ exit(1);
+ } else
+ LOGPRINTF("close_query return\n");
+ }
+ }
+ ttq_stop = get_time();
+skip:
+ if (!open_query)
+ goto done;
+
+ /* Original Method - Open, Query, Close */
+ tt_start = get_time();
+ for (i=0;i<p_cnt;i++) {
+ for (it=0;it<iters;it++) {
+ LOGPRINTF("open[%d][%d] - %s\n", i, it, p_list[i]->ia_name);
+ p_evd[i] = DAT_HANDLE_NULL;
+ start = get_time();
+ ret = dat_ia_open(p_list[i]->ia_name, 2, &p_evd[i], &p_ia[i]);
+ stop = get_time();
+ dt_profile(&open_avg[i], &open_min[i], &open_max[i], start, stop);
+ if (ret != DAT_SUCCESS) {
+ LOGPRINTF("Error open: %s on %s[%d][%d]\n",
+ DT_RetToStr(ret),
+ p_list[i]->ia_name, i, it);
+ continue;
+ } else
+ LOGPRINTF("open[%d] - %s ia = %p\n",
+ i, p_list[i]->ia_name, p_ia[i]);
+
+ start = get_time();
+ ret = dat_ia_query(p_ia[i], 0,
+ DAT_IA_FIELD_ALL, &p_ia_attr[i],
+ DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR,
+ &p_pr_attr[i]);
+ stop = get_time();
+ dt_profile(&query_avg[i], &query_min[i], &query_max[i], start, stop);
+ if (ret != DAT_SUCCESS) {
+ fprintf(stderr, "ERR query: %s\n", DT_RetToStr(ret));
+ exit(1);
+ } else
+ LOGPRINTF("query[%d] - %s num_pr_spec %d\n",
+ i, p_list[i]->ia_name,
+ p_pr_attr[i].num_provider_specific_attr);
+
+ /* Provider specific attributes */
+ for (ii=0; ii<p_pr_attr[i].num_provider_specific_attr; ii++) {
+ LOGPRINTF("Provider_attr[%d] %s = %s VER: hw %d ext %d \n",
+ ii,
+ p_pr_attr[i].provider_specific_attr[ii].name,
+ p_pr_attr[i].provider_specific_attr[ii].value,
+ p_ia_attr[i].hardware_version_major,
+ p_ia_attr[i].extension_version);
+ }
+ if (verbose)
+ print_ia_address(ia_attr.ia_address_ptr);
+
+ start = get_time();
+ ret = dat_ia_close(p_ia[i], DAT_CLOSE_ABRUPT_FLAG);
+ stop = get_time();
+ dt_profile(&close_avg[i], &close_min[i], &close_max[i], start, stop);
+ if (ret != DAT_SUCCESS) {
+ fprintf(stderr, "ERR close_query: %s\n", DT_RetToStr(ret));
+ exit(1);
+ } else
+ LOGPRINTF("close[%d] - %s ia = %p\n",
+ i, p_list[i]->ia_name, p_ia[i]);
+ }
+ }
+ tt_stop = get_time();
+done:
+ /* print performance */
+ printf("Query_Times (avg,min,max_us) for each provider (i=%d):\n",
+ p_cnt, iters);
+ for (i=0;i<p_cnt;i++) {
+ printf(" %s:\n", p_list[i]->ia_name);
+ printf(" open: %8.2lf %8.2lf %8.2lf\n",
+ open_avg[i], open_min[i], open_max[i]);
+ printf(" query: %8.2lf %8.2lf %8.2lf\n",
+ query_avg[i], query_min[i], query_max[i]);
+ printf(" close: %8.2lf %8.2lf %8.2lf\n",
+ close_avg[i], close_min[i], close_max[i]);
+ printf(" open_query: %8.2lf %8.2lf %8.2lf\n",
+ openq_avg[i], openq_min[i], openq_max[i]);
+ printf(" close_query:%8.2lf %8.2lf %8.2lf\n",
+ closeq_avg[i], closeq_min[i], closeq_max[i]);
+ }
+ printf("\nTotal_Query_Times for %d providers (i=%d):\n"
+ " open/query/close = %4.2lf secs\n"
+ " open_query/close_query = %4.2lf secs\n",
+ p_cnt, iters, tt_stop - tt_start,
+ ttq_stop - ttq_start);
+bail:
+ for (i = 0; i < MAX_PROV; i++ ) {
+ if (p_list[i] != NULL)
+ free(p_list[i]);
+ }
+ free(p_list);
+}
+
int main(int argc, char **argv)
{
- int c, i;
+ int c, i, type;
DAT_RETURN ret;
DAT_EP_PARAM ep_param;
DAT_PROVIDER_ATTR pr_attr;
/* parse arguments */
- while ((c = getopt(argc, argv, "AQautscvpq:l:b:d:B:h:P:S:e:")) != -1) {
+ while ((c = getopt(argc, argv, "Aautscvpq:l:b:d:B:h:P:S:e:Q:")) != -1) {
switch (c) {
case 'A': /* all tests, msg, rdma read and write */
write_only = 0;
break;
- case 'Q': /* query only */
- query_only = 1;
- break;
case 'a':
align_data = 1;
fflush(stdout);
case 'S':
signal_rate = atoi(optarg);
break;
+ case 'Q': /* 1 == open,query,close or 2 == open_query_ext */
+ type = atoi(optarg);
+ if (type == 1)
+ open_query = 1;
+ else if (type == 2)
+ open_query_ext = 1;
+ else
+ open_query = open_query_ext = 1;
+ break;
default:
print_usage();
exit(-12);
LOGPRINTF("%d Allocated RMR buffers (r:%p,s:%p) len %d \n",
getpid(), p_rmr_rcv, p_rmr_snd, 4096);
+ if (open_query || open_query_ext) {
+ prof_query_providers(burst);
+ goto close;
+ }
+
/* query_by_name */
start = get_time();
ret = dat_ib_open_query(provider,
} else
LOGPRINTF("%d Query_by_name \n", getpid());
-
-
/* dat_ia_open, dat_pz_create */
h_async_evd = DAT_HANDLE_NULL;
start = get_time();
pr_attr.provider_specific_attr[i].value);
}
- if (query_only)
- goto close;
/* Create Protection Zone */
start = get_time();
printf("l: server lid (required ucm provider)\n");
printf("q: server qpn (required ucm provider)\n");
printf("S: signal_rate (default=10, completion every 10 iterations\n");
+ printf("Q: query device, 1 = open/query/close, 2 = open_query/close_query, 3 = both\n");
printf("\n");
}