perftest: adjust performance counters for ridiculously long Vista time stamping
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sat, 28 Feb 2009 17:50:43 +0000 (17:50 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sat, 28 Feb 2009 17:50:43 +0000 (17:50 +0000)
Adjust time stamping to account for lengthy time stamps.  Only keep performance
data on the client side to avoid server time stamping overhead.  Extract out
common performance code into a new module that's included by all the perftests.

Problem was reported by Leonid.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1992 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

18 files changed:
tests/perftest/perftest.c [new file with mode: 0644]
tests/perftest/perftest.h [new file with mode: 0644]
tests/perftest/rdma_bw/SOURCES
tests/perftest/rdma_bw/rdma_bw.c
tests/perftest/rdma_lat/SOURCES
tests/perftest/rdma_lat/rdma_lat.c
tests/perftest/read_bw/SOURCES
tests/perftest/read_bw/read_bw.c
tests/perftest/read_lat/SOURCES
tests/perftest/read_lat/read_lat.c
tests/perftest/send_bw/SOURCES
tests/perftest/send_bw/send_bw.c
tests/perftest/send_lat/SOURCES
tests/perftest/send_lat/send_lat.c
tests/perftest/write_bw/SOURCES
tests/perftest/write_bw/write_bw.c
tests/perftest/write_lat/SOURCES
tests/perftest/write_lat/write_lat.c

diff --git a/tests/perftest/perftest.c b/tests/perftest/perftest.c
new file mode 100644 (file)
index 0000000..35b6327
--- /dev/null
@@ -0,0 +1,82 @@
+/*\r
+ * Copyright (c) 2005 Topspin Communications.  All rights reserved.\r
+ * Copyright (c) 2005 Mellanox Technologies Ltd.  All rights reserved.\r
+ * Copyright (c) 2005 Hewlett Packard, Inc (Grant Grundler)\r
+ * Copyright (c) 2008-2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#include "perftest.h"\r
+\r
+UINT64 get_cycles()\r
+{\r
+       LARGE_INTEGER counter;\r
+       static UINT64 base_adj = 0;\r
+       static UINT64 running_adj = 0;\r
+\r
+       if (base_adj == 0) {\r
+               int i;\r
+\r
+               QueryPerformanceCounter(&counter);\r
+               base_adj = counter.QuadPart;\r
+               for (i = 0; i < (1 << 16) - 2; i++) {\r
+                       QueryPerformanceCounter(&counter);\r
+               }\r
+               QueryPerformanceCounter(&counter);\r
+               base_adj = (counter.QuadPart - base_adj) >> 16;\r
+       }\r
+\r
+       QueryPerformanceCounter(&counter);\r
+\r
+       running_adj += base_adj;\r
+       return counter.QuadPart - running_adj;\r
+}\r
+\r
+UINT64 get_freq()\r
+{\r
+       LARGE_INTEGER freq;\r
+       QueryPerformanceFrequency(&freq);\r
+       return freq.QuadPart;\r
+}\r
+\r
+cycles_t get_median(int n, cycles_t delta[])\r
+{\r
+       if ((n - 1) % 2)\r
+               return(delta[n / 2] + delta[n / 2 - 1]) / 2;\r
+       else\r
+               return delta[n / 2];\r
+}\r
+\r
+int __cdecl cycles_compare(const void * aptr, const void * bptr)\r
+{\r
+       const cycles_t *a = aptr;\r
+       const cycles_t *b = bptr;\r
+       if (*a < *b) return -1;\r
+       if (*a > *b) return 1;\r
+       return 0;\r
+\r
+}\r
diff --git a/tests/perftest/perftest.h b/tests/perftest/perftest.h
new file mode 100644 (file)
index 0000000..e0fd9c5
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) 2005 Topspin Communications.  All rights reserved.\r
+ * Copyright (c) 2005 Mellanox Technologies Ltd.  All rights reserved.\r
+ * Copyright (c) 2005 Hewlett Packard, Inc (Grant Grundler)\r
+ * Copyright (c) 2008-2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#include <windows.h>\r
+\r
+typedef UINT64 cycles_t;\r
+\r
+UINT64 get_cycles();\r
+UINT64 get_freq();\r
+\r
+cycles_t get_median(int n, cycles_t delta[]);\r
+int __cdecl cycles_compare(const void * aptr, const void * bptr);\r
index 6e4ffe1..f0bbf0e 100644 (file)
@@ -10,11 +10,11 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       rdma_bw.rc              \\r
-       rdma_bw.c\r
+SOURCES = rdma_bw.rc rdma_bw.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\ulp\librdmacm\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\ulp\librdmacm\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
@@ -24,7 +24,7 @@ TARGETLIBS =                                          \
        $(SDK_LIB_PATH)\ws2_32.lib              \\r
 !if $(FREEBUILD)\r
        $(TARGETPATH)\*\libibverbs.lib  \\r
-       $(TARGETPATH)\*\librdmacm.lib   \\r
+       $(TARGETPATH)\*\librdmacm.lib\r
 !else\r
        $(TARGETPATH)\*\libibverbsd.lib \\r
        $(TARGETPATH)\*\librdmacmd.lib\r
index f91b992..32afba5 100644 (file)
@@ -37,6 +37,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 #include <rdma/rdma_cma.h>\r
 \r
@@ -88,22 +89,6 @@ static void pp_send_start(struct pingpong_context *);
 static void pp_close_cma(struct pp_data );\r
 static struct pingpong_context *pp_init_ctx(void *, struct pp_data *);\r
 \r
-typedef UINT64 cycles_t;\r
-\r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -842,10 +827,10 @@ static void print_report(unsigned int iters, unsigned size, int duplex,
                mbytes = (double) tsize * (double) iters / (double) 0x100000;\r
                printf("Bandwidth average: %7.2f MB/sec\n", mbytes / sec);\r
 \r
-               printf("%Service Demand peak (#%d to #%d): %7.2f cycles/KB\n",\r
+               printf("Service Demand peak (#%d to #%d): %7.2f cycles/KB\n",\r
                                 opt_posted, opt_completed,\r
                                 (double) opt_delta * 1024. / (double) tsize);\r
-               printf("%Service Demand Avg  : %7.2f cycles/KB\n",\r
+               printf("Service Demand Avg  : %7.2f cycles/KB\n",\r
                                 (double) (tcompleted[iters - 1] - tposted[0]) * 1024. / (double) (tsize * iters));     \r
        }\r
 }\r
@@ -1117,7 +1102,8 @@ int __cdecl main(int argc, char *argv[])
 \r
                while (scnt < iters && scnt - ccnt < data.tx_depth) {\r
                        struct ibv_send_wr *bad_wr;\r
-                       tposted[scnt] = get_cycles();\r
+                       if (data.servername)\r
+                               tposted[scnt] = get_cycles();\r
 \r
                        if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
                                fprintf(stderr, "Couldn't post send: scnt=%d\n", scnt);\r
@@ -1133,7 +1119,8 @@ int __cdecl main(int argc, char *argv[])
                                ne = ibv_poll_cq(ctx->scq, 1, &wc);\r
                        } while (ne == 0);\r
 \r
-                       tcompleted[ccnt] = get_cycles();\r
+                       if (data.servername)\r
+                               tcompleted[ccnt] = get_cycles();\r
 \r
                        if (ne < 0) {\r
                                fprintf(stderr, "poll CQ failed %d\n", ne);\r
index 6933bdd..c1e26ad 100644 (file)
@@ -10,11 +10,11 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       rdma_lat.rc             \\r
-       rdma_lat.c\r
+SOURCES = rdma_lat.rc rdma_lat.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\ulp\librdmacm\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\ulp\librdmacm\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index 65b26c6..949ef0c 100644 (file)
@@ -38,6 +38,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 #include <rdma/rdma_cma.h>\r
 \r
@@ -101,22 +102,6 @@ static void pp_send_start(struct pingpong_context *);
 static void pp_close_cma(struct pp_data );\r
 static struct pingpong_context *pp_init_ctx(void *, struct pp_data *);\r
 \r
-typedef UINT64 cycles_t;\r
-\r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -884,30 +869,6 @@ static void usage(const char *argv0)
        printf("  -c, --cma              Use the RDMA CMA to setup the RDMA connection\n");\r
 }\r
 \r
-/*\r
- * When there is an\r
- *     odd number of samples, the median is the middle number.\r
- *     even number of samples, the median is the mean of the\r
- *             two middle numbers.\r
- *\r
- */\r
-static cycles_t get_median(int n, cycles_t delta[])\r
-{\r
-       if ((n - 1) % 2)\r
-               return (delta[n / 2] + delta[n / 2 - 1]) / 2;\r
-       else\r
-               return delta[n / 2];\r
-}\r
-\r
-static int __cdecl cycles_compare(const void * aptr, const void * bptr)\r
-{\r
-       const cycles_t *a = aptr;\r
-       const cycles_t *b = bptr;\r
-       if (*a < *b) return -1;\r
-       if (*a > *b) return 1;\r
-       return 0;\r
-}\r
-\r
 static void print_report(struct report_options * options,\r
                         unsigned int iters, cycles_t *tstamp)\r
 {\r
@@ -1177,7 +1138,8 @@ int __cdecl main(int argc, char *argv[])
 \r
                if (scnt < iters) {\r
                        struct ibv_send_wr *bad_wr;\r
-                       tstamp[scnt] = get_cycles();\r
+                       if (data.servername)\r
+                               tstamp[scnt] = get_cycles();\r
 \r
                        *post_buf = (char)++scnt;\r
                        if (ibv_post_send(qp, wr, &bad_wr)) {\r
index 63e25c2..0c28233 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =              \\r
-       read_bw.rc      \\r
-       read_bw.c\r
+SOURCES = read_bw.rc read_bw.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index 9ca73bd..d3013ab 100644 (file)
@@ -1,7 +1,7 @@
 /*\r
  * Copyright (c) 2005 Topspin Communications.  All rights reserved.\r
  * Copyright (c) 2006 Mellanox Technologies Ltd.  All rights reserved.\r
- * Copyright (c) 2008 Intel Corporation.  All rights reserved.\r
+ * Copyright (c) 2008-2009 Intel Corporation.  All rights reserved.\r
  *\r
  * This software is available to you under the OpenIB.org BSD license\r
  * below:\r
@@ -37,6 +37,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_READ_WRID     1\r
@@ -81,20 +82,6 @@ struct pingpong_dest {
        unsigned long long vaddr;\r
 };\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -541,7 +528,8 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
        while (scnt < user_param->iters || ccnt < user_param->iters) {\r
                while (scnt < user_param->iters && (scnt - ccnt) < user_param->tx_depth ) {\r
                        struct ibv_send_wr *bad_wr;\r
-                       tposted[scnt] = get_cycles();\r
+                       if (user_param->servername)\r
+                               tposted[scnt] = get_cycles();\r
                        if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
                                fprintf(stderr, "Couldn't post send: scnt=%d\n",\r
                                        scnt);\r
@@ -571,7 +559,8 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
                        do {\r
                                ne = ibv_poll_cq(ctx->cq, 1, &wc);\r
                                if (ne) {\r
-                                       tcompleted[ccnt] = get_cycles();\r
+                                       if (user_param->servername)\r
+                                               tcompleted[ccnt] = get_cycles();\r
                                        if (wc.status != IBV_WC_SUCCESS) {\r
                                                fprintf(stderr, "Completion wth error at %s:\n",\r
                                                        user_param->servername ? "client" : "server");\r
index f87fc2b..2aebbe0 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       read_lat.rc             \\r
-       read_lat.c\r
+SOURCES = read_lat.rc read_lat.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index f99e13c..e5062a4 100644 (file)
@@ -38,6 +38,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_READ_WRID     1\r
@@ -90,20 +91,6 @@ struct pingpong_dest {
 };\r
 struct pingpong_dest my_dest;\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -567,30 +554,6 @@ static void usage(const char *argv0)
        printf("  -e               sleep on CQ events (default poll)\n");\r
 }\r
 \r
-/*\r
- * When there is an\r
- *     odd number of samples, the median is the middle number.\r
- *     even number of samples, the median is the mean of the\r
- *             two middle numbers.\r
- *\r
- */\r
-static __inline cycles_t get_median(int n, cycles_t delta[])\r
-{\r
-       if ((n - 1) % 2)\r
-               return (delta[n / 2] + delta[n / 2 - 1]) / 2;\r
-       else\r
-               return delta[n / 2];\r
-}\r
-\r
-static int __cdecl cycles_compare(const void * aptr, const void * bptr)\r
-{\r
-       const cycles_t *a = aptr;\r
-       const cycles_t *b = bptr;\r
-       if (*a < *b) return -1;\r
-       if (*a > *b) return 1;\r
-       return 0;\r
-}\r
-\r
 static void print_report(struct report_options * options,\r
                         unsigned int iters, cycles_t *tstamp,int size)\r
 {\r
index 9c6eb61..907bcfb 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       send_bw.rc              \\r
-       send_bw.c\r
+SOURCES = send_bw.rc send_bw.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index f068d38..d3fa8b5 100644 (file)
@@ -36,6 +36,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_SEND_WRID  1\r
@@ -96,20 +97,6 @@ struct pingpong_dest {
        unsigned long long vaddr;\r
 };\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -717,7 +704,8 @@ static int run_iter_bi(struct pingpong_context *ctx, struct user_parameters *use
                while (scnt < user_param->iters &&\r
                       (scnt - ccnt) < user_param->tx_depth / 2) {\r
                        struct ibv_send_wr *bad_wr;\r
-                       tposted[scnt] = get_cycles();\r
+                       if (user_param->servername)\r
+                               tposted[scnt] = get_cycles();\r
                        if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
                                fprintf(stderr, "Couldn't post send: scnt=%d\n",\r
                                        scnt);\r
@@ -757,7 +745,8 @@ static int run_iter_bi(struct pingpong_context *ctx, struct user_parameters *use
                        }\r
                        switch ((int) wc.wr_id) {\r
                        case PINGPONG_SEND_WRID:\r
-                               tcompleted[ccnt] = get_cycles();\r
+                               if (user_param->servername)\r
+                                       tcompleted[ccnt] = get_cycles();\r
                                ccnt += 1;\r
                                break;\r
                        case PINGPONG_RECV_WRID:\r
@@ -841,7 +830,8 @@ static int run_iter_uni(struct pingpong_context *ctx, struct user_parameters *us
                        do {\r
                                ne = ibv_poll_cq(ctx->cq, 1, &wc);\r
                                if (ne) {\r
-                                       tcompleted[ccnt] = get_cycles();\r
+                                       if (user_param->servername)\r
+                                               tcompleted[ccnt] = get_cycles();\r
                                        if (wc.status != IBV_WC_SUCCESS) {\r
                                                fprintf(stderr, "Completion wth error at %s:\n",\r
                                                        user_param->servername ? "client" : "server");\r
@@ -871,7 +861,8 @@ static int run_iter_uni(struct pingpong_context *ctx, struct user_parameters *us
                while (scnt < user_param->iters || ccnt < user_param->iters) {\r
                        while (scnt < user_param->iters && (scnt - ccnt) < user_param->tx_depth ) {\r
                                struct ibv_send_wr *bad_wr;\r
-                               tposted[scnt] = get_cycles();\r
+                               if (user_param->servername)\r
+                                       tposted[scnt] = get_cycles();\r
                                if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
                                        fprintf(stderr, "Couldn't post send: scnt=%d\n",\r
                                                scnt);\r
@@ -903,7 +894,8 @@ static int run_iter_uni(struct pingpong_context *ctx, struct user_parameters *us
                                        if (ne <= 0)\r
                                                break;\r
 \r
-                                       tcompleted[ccnt] = get_cycles();\r
+                                       if (user_param->servername)\r
+                                               tcompleted[ccnt] = get_cycles();\r
                                        if (wc.status != IBV_WC_SUCCESS) {\r
                                                fprintf(stderr, "Completion wth error at %s:\n",\r
                                                        user_param->servername ? "client" : "server");\r
index a3fc985..e92f25b 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       send_lat.rc             \\r
-       send_lat.c\r
+SOURCES = send_lat.rc send_lat.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index 81ededa..05bd130 100644 (file)
@@ -38,6 +38,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_SEND_WRID  1\r
@@ -101,20 +102,6 @@ struct pingpong_dest {
        unsigned int rkey;\r
 };\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -714,31 +701,6 @@ static void usage(const char *argv0)
        printf("  -g             send messages to multicast group(only available in UD connection\n");\r
 }\r
 \r
-/*\r
- * When there is an\r
- *     odd number of samples, the median is the middle number.\r
- *     even number of samples, the median is the mean of the\r
- *             two middle numbers.\r
- *\r
- */\r
-static __inline cycles_t get_median(int n, cycles_t delta[])\r
-{\r
-       if ((n - 1) % 2)\r
-               return(delta[n / 2] + delta[n / 2 - 1]) / 2;\r
-       else\r
-               return delta[n / 2];\r
-}\r
-\r
-static int __cdecl cycles_compare(const void * aptr, const void * bptr)\r
-{\r
-       const cycles_t *a = aptr;\r
-       const cycles_t *b = bptr;\r
-       if (*a < *b) return -1;\r
-       if (*a > *b) return 1;\r
-       return 0;\r
-\r
-}\r
-\r
 static void print_report(struct report_options * options,\r
                         unsigned int iters, cycles_t *tstamp,int size)\r
 {\r
@@ -911,7 +873,8 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
 \r
                        }\r
                        /* client post first */\r
-                       tstamp[scnt] = get_cycles();\r
+                       if (user_param->servername)\r
+                               tstamp[scnt] = get_cycles();\r
                        *post_buf = (char)++scnt;\r
                        if (ibv_post_send(qp, wr, &bad_wr)) {\r
                                fprintf(stderr, "Couldn't post send: scnt=%d\n",\r
index c0e15cd..4e7a5a1 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       write_bw.rc             \\r
-       write_bw.c\r
+SOURCES = write_bw.rc write_bw.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index eb9a5a2..15fd27b 100644 (file)
@@ -37,6 +37,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_RDMA_WRID     3\r
@@ -90,20 +91,6 @@ struct pingpong_dest {
        unsigned long long vaddr;\r
 };\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -606,8 +593,9 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
            ctx->wr.wr.rdma.remote_addr = rem_dest[index]->vaddr;\r
             ctx->wr.wr.rdma.rkey = rem_dest[index]->rkey;\r
             qp = ctx->qp[index];\r
-            ctx->wr.wr_id      = index ;\r
-            tposted[totscnt] = get_cycles();\r
+            ctx->wr.wr_id = index;\r
+                       if (user_param->servername)\r
+                   tposted[totscnt] = get_cycles();\r
             if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
                 fprintf(stderr, "Couldn't post warmup send: qp index = %d qp scnt=%d total scnt %d\n",\r
                         index,ctx->scnt[index],totscnt);\r
@@ -617,50 +605,59 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
             ++totscnt;\r
       }\r
        }    \r
+\r
        /* main loop for posting */\r
-       while (totscnt < (user_param->iters * user_param->numofqps)  || totccnt < (user_param->iters * user_param->numofqps) ) {\r
-         /* main loop to run over all the qps and post each time n messages */\r
-         for (index =0 ; index < user_param->numofqps ; index++) {\r
-          ctx->wr.wr.rdma.remote_addr = rem_dest[index]->vaddr;\r
-          ctx->wr.wr.rdma.rkey = rem_dest[index]->rkey;\r
-          qp = ctx->qp[index];\r
-          ctx->wr.wr_id      = index ;\r
-          while (ctx->scnt[index] < user_param->iters && (ctx->scnt[index] - ctx->ccnt[index]) < user_param->maxpostsofqpiniteration) {\r
-             tposted[totscnt] = get_cycles();\r
-             if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
-              fprintf(stderr, "Couldn't post send: qp index = %d qp scnt=%d total scnt %d\n",\r
-                      index,ctx->scnt[index],totscnt);\r
-              return 1;\r
-             }     \r
-             ctx->scnt[index]= ctx->scnt[index]+1;\r
-             ++totscnt;\r
-           }\r
-         }\r
-         /* finished posting now polling */\r
-         if (totccnt < (user_param->iters * user_param->numofqps) ) {\r
-           \r
-           int ne;\r
-           do {\r
-             ne = ibv_poll_cq(ctx->cq, 1, &wc);\r
-           } while (ne == 0);\r
-           tcompleted[totccnt] = get_cycles();\r
-        if (ne < 0) {\r
-             fprintf(stderr, "poll CQ failed %d\n", ne);\r
-             return 1;\r
-           }\r
-           if (wc.status != IBV_WC_SUCCESS) {\r
-             fprintf(stderr, "Completion wth error at %s:\n",\r
-                     user_param->servername ? "client" : "server");\r
-             fprintf(stderr, "Failed status %d: wr_id %d\n",\r
-                     wc.status, (int) wc.wr_id);\r
-             fprintf(stderr, "qp index %d ,qp scnt=%d, qp ccnt=%d total scnt %d total ccnt %d\n",\r
-                     (int)wc.wr_id, ctx->scnt[(int)wc.wr_id], ctx->ccnt[(int)wc.wr_id], totscnt, totccnt);\r
-             return 1;\r
-           }\r
-           /*here the id is the index to the qp num */\r
-           ctx->ccnt[(int)wc.wr_id] = ctx->ccnt[(int)wc.wr_id]+1;\r
-           totccnt += 1;\r
-         }\r
+       while (totscnt < (user_param->iters * user_param->numofqps) ||\r
+                  totccnt < (user_param->iters * user_param->numofqps) ) {\r
+               /* main loop to run over all the qps and post each time n messages */\r
+               for (index =0 ; index < user_param->numofqps ; index++) {\r
+                       ctx->wr.wr.rdma.remote_addr = rem_dest[index]->vaddr;\r
+                       ctx->wr.wr.rdma.rkey = rem_dest[index]->rkey;\r
+                       qp = ctx->qp[index];\r
+                       ctx->wr.wr_id = index;\r
+\r
+                       while (ctx->scnt[index] < user_param->iters &&\r
+                                  (ctx->scnt[index] - ctx->ccnt[index]) < user_param->maxpostsofqpiniteration) {\r
+                               if (user_param->servername)\r
+                                       tposted[totscnt] = get_cycles();\r
+                               if (ibv_post_send(qp, &ctx->wr, &bad_wr)) {\r
+                                       fprintf(stderr, "Couldn't post send: qp index = %d qp scnt=%d total scnt %d\n",\r
+                                                       index,ctx->scnt[index],totscnt);\r
+                                       return 1;\r
+                               }     \r
+                               ctx->scnt[index]= ctx->scnt[index]+1;\r
+                               ++totscnt;\r
+                       }\r
+               }\r
+\r
+               /* finished posting now polling */\r
+               if (totccnt < (user_param->iters * user_param->numofqps) ) {\r
+                       int ne;\r
+                       do {\r
+                               ne = ibv_poll_cq(ctx->cq, 1, &wc);\r
+                       } while (ne == 0);\r
+\r
+                       if (user_param->servername)\r
+                               tcompleted[totccnt] = get_cycles();\r
+\r
+                       if (ne < 0) {\r
+                               fprintf(stderr, "poll CQ failed %d\n", ne);\r
+                               return 1;\r
+                       }\r
+\r
+                       if (wc.status != IBV_WC_SUCCESS) {\r
+                               fprintf(stderr, "Completion wth error at %s:\n",\r
+                               user_param->servername ? "client" : "server");\r
+                               fprintf(stderr, "Failed status %d: wr_id %d\n",\r
+                               wc.status, (int) wc.wr_id);\r
+                               fprintf(stderr, "qp index %d ,qp scnt=%d, qp ccnt=%d total scnt %d total ccnt %d\n",\r
+                                           (int)wc.wr_id, ctx->scnt[(int)wc.wr_id], ctx->ccnt[(int)wc.wr_id], totscnt, totccnt);\r
+                               return 1;\r
+                       }\r
+                       /*here the id is the index to the qp num */\r
+                       ctx->ccnt[(int)wc.wr_id] = ctx->ccnt[(int)wc.wr_id]+1;\r
+                       totccnt += 1;\r
+               }\r
        }\r
        return(0);\r
 }\r
index 316a625..f869ff1 100644 (file)
@@ -10,11 +10,10 @@ USE_STL = 1
 USE_NATIVE_EH = 1\r
 USE_IOSTREAM = 1\r
 \r
-SOURCES =                      \\r
-       write_lat.rc    \\r
-       write_lat.c\r
+SOURCES = write_lat.rc write_lat.c ..\perftest.c\r
        \r
-INCLUDES = ..\..\..\ulp\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
+                  ..\..\..\inc;..\..\..\inc\user;\r
 \r
 TARGETLIBS =                                           \\r
        $(SDK_LIB_PATH)\kernel32.lib    \\r
index 95748aa..81f5cfc 100644 (file)
@@ -38,6 +38,7 @@
 #include <time.h>\r
 \r
 #include "..\..\..\etc\user\getopt.c"\r
+#include "perftest.h"\r
 #include <infiniband/verbs.h>\r
 \r
 #define PINGPONG_RDMA_WRID     3\r
@@ -87,20 +88,6 @@ struct pingpong_dest {
        unsigned long long vaddr;\r
 };\r
 \r
-static __inline UINT64 get_cycles()\r
-{\r
-       LARGE_INTEGER counter;\r
-       QueryPerformanceCounter(&counter);\r
-       return counter.QuadPart;\r
-}\r
-\r
-static __inline UINT64 get_freq()\r
-{\r
-       LARGE_INTEGER freq;\r
-       QueryPerformanceFrequency(&freq);\r
-       return freq.QuadPart;\r
-}\r
-\r
 static uint16_t pp_get_local_lid(struct pingpong_context *ctx, int port)\r
 {\r
        struct ibv_port_attr attr;\r
@@ -583,30 +570,6 @@ static void usage(const char *argv0)
        printf("  -V            display version number\n");\r
 }\r
 \r
-/*\r
- * When there is an\r
- *     odd number of samples, the median is the middle number.\r
- *     even number of samples, the median is the mean of the\r
- *             two middle numbers.\r
- *\r
- */\r
-static __inline cycles_t get_median(int n, cycles_t delta[])\r
-{\r
-       if ((n - 1) % 2)\r
-               return(delta[n / 2] + delta[n / 2 - 1]) / 2;\r
-       else\r
-               return delta[n / 2];\r
-}\r
-\r
-static int __cdecl cycles_compare(const void * aptr, const void * bptr)\r
-{\r
-       const cycles_t *a = aptr;\r
-       const cycles_t *b = bptr;\r
-       if (*a < *b) return -1;\r
-       if (*a > *b) return 1;\r
-       return 0;\r
-}\r
-\r
 static void print_report(struct report_options * options,\r
                         unsigned int iters, cycles_t *tstamp,int size)\r
 {\r
@@ -711,7 +674,8 @@ static int run_iter(struct pingpong_context *ctx, struct user_parameters *user_p
 \r
                if (scnt < user_param->iters) {\r
                        struct ibv_send_wr *bad_wr;\r
-                       tstamp[scnt] = get_cycles();\r
+                       if (user_param->servername)\r
+                               tstamp[scnt] = get_cycles();\r
 \r
                        *post_buf = (char)++scnt;\r
 \r