]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
dtest: add new -Q option to get provider list and query and time each
authorArlin Davis <arlin.r.davis@intel.com>
Mon, 24 Feb 2014 17:44:32 +0000 (09:44 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Mon, 24 Feb 2014 17:44:32 +0000 (09:44 -0800)
3 modes for -Q added to dtest:

-Q 1 == open/query/close, normal method
-Q 2 == open_query/close_query mode, new extensions
-Q 3 == both modes

Individual query and total times are reported. With
the new -Q option, dtest will query and exit without
connection or data transfer tests

If query extensions are not supported open_query will
simply return DAT_NOT_IMPLEMENTED.

Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
test/dtest/dtest.c

index 865f424e1a1031ad4457defef4c4b7023ffc13cc..1055f5f01a05565e881bf0b0fd59ff20e60cd1c2 100755 (executable)
@@ -215,12 +215,13 @@ static int rdma_rd_poll_count[MAX_RDMA_RD] = { 0 };
 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;
 
@@ -354,22 +355,252 @@ static void print_ia_address(struct sockaddr *sa)
        }
 }
 
+#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);
@@ -440,6 +671,15 @@ int main(int argc, char **argv)
                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);
@@ -507,6 +747,11 @@ int main(int argc, char **argv)
        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,
@@ -540,8 +785,6 @@ int main(int argc, char **argv)
        } else
                LOGPRINTF("%d Query_by_name \n", getpid());
 
-
-
        /* dat_ia_open, dat_pz_create */
        h_async_evd = DAT_HANDLE_NULL;
        start = get_time();
@@ -578,8 +821,6 @@ int main(int argc, char **argv)
                          pr_attr.provider_specific_attr[i].value);
        }
 
-       if (query_only)
-               goto close;
 
        /* Create Protection Zone */
        start = get_time();
@@ -2283,6 +2524,7 @@ void print_usage(void)
        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");
 }