From 4cd55edbdfa5327e35c135b6325388bd95aa7312 Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Tue, 13 Sep 2016 15:47:45 -0700 Subject: [PATCH 01/12] WAR bug: don't try to initialize GPU memory --- src/perftest_resources.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/perftest_resources.c b/src/perftest_resources.c index afae5f2..f6e32ba 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -1251,6 +1251,9 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u /* Initialize buffer with random numbers */ srand(time(NULL)); + #ifdef HAVE_CUDA + if (!user_param->use_cuda) + #endif for (i = 0; i < ctx->buff_size; i++) { ((char*)ctx->buf[qp_index])[i] = (char)rand(); } From a810bea619e55563a3882ee24f59cbf73b55aee6 Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Wed, 14 Sep 2016 14:10:17 -0700 Subject: [PATCH 02/12] fix crash when enabling cuda without nv_peer_mem --- src/perftest_resources.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/perftest_resources.c b/src/perftest_resources.c index f6e32ba..6b8b332 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -1341,10 +1341,12 @@ int ctx_init(struct pingpong_context *ctx, struct perftest_parameters *user_para if (create_mr(ctx, user_param)) { fprintf(stderr, "Failed to create MR\n"); + return FAILURE; } if (create_cqs(ctx, user_param)) { fprintf(stderr, "Failed to create CQs\n"); + return FAILURE; } #ifdef HAVE_XRCD From 5f3535ae06cd28492a8b92642281277759a4a9ed Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Wed, 2 Nov 2016 15:55:21 -0700 Subject: [PATCH 03/12] don't parse --use_cuda if HAVE_CUDA is not defined --- src/perftest_parameters.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c index a21b6eb..9c2bf59 100755 --- a/src/perftest_parameters.c +++ b/src/perftest_parameters.c @@ -603,7 +603,9 @@ static void init_perftest_params(struct perftest_parameters *user_param) user_param->rate_limit_type = DISABLE_RATE_LIMIT; user_param->is_rate_limit_type = 0; user_param->output = -1; + #ifdef HAVE_CUDA user_param->use_cuda = 0; + #endif user_param->mmap_file = NULL; user_param->mmap_offset = 0; user_param->iters_per_port[0] = 0; @@ -1534,7 +1536,9 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) static int retry_count_flag = 0; static int dont_xchg_versions_flag = 0; static int use_exp_flag = 0; + #ifdef HAVE_CUDA static int use_cuda_flag = 0; + #endif static int mmap_file_flag = 0; static int mmap_offset_flag = 0; static int ipv6_flag = 0; @@ -1630,7 +1634,9 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) { .name = "flow_label", .has_arg = 1, .flag = &flow_label_flag, .val = 1}, { .name = "retry_count", .has_arg = 1, .flag = &retry_count_flag, .val = 1}, { .name = "dont_xchg_versions", .has_arg = 0, .flag = &dont_xchg_versions_flag, .val = 1}, + #ifdef HAVE_CUDA { .name = "use_cuda", .has_arg = 0, .flag = &use_cuda_flag, .val = 1}, + #endif { .name = "mmap", .has_arg = 1, .flag = &mmap_file_flag, .val = 1}, { .name = "mmap-offset", .has_arg = 1, .flag = &mmap_offset_flag, .val = 1}, { .name = "ipv6", .has_arg = 0, .flag = &ipv6_flag, .val = 1}, @@ -2051,10 +2057,11 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) if (use_res_domain_flag) { user_param->use_res_domain = 1; } - + #ifdef HAVE_CUDA if (use_cuda_flag) { user_param->use_cuda = 1; } + #endif if (report_both_flag) { user_param->report_both = 1; } From dfef9b9e7032ef3dadba1103c19fb44b4fe1eb56 Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Mon, 21 Nov 2016 11:51:06 -0800 Subject: [PATCH 04/12] add help string for CUDA_H_PATH configure var --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 5964256..8ea669b 100755 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) -AC_ARG_VAR(CUDA_H_PATH, help-string) +AC_ARG_VAR(CUDA_H_PATH, path to CUDA Toolkit include directory (enables CUDA support)) AC_ARG_VAR(RANLIB, ranlib tool) AC_ARG_ENABLE([verbs_exp], @@ -201,7 +201,7 @@ fi if [test "$CUDA_H_PATH" ]; then AC_DEFINE([HAVE_CUDA], [1], [Enable CUDA feature]) - AC_DEFINE_UNQUOTED([CUDA_PATH], "$CUDA_H_PATH" , [Enable CUDA feature]) + AC_DEFINE_UNQUOTED([CUDA_PATH], "$CUDA_H_PATH" , [Path to CUDA toolkit include directory]) LIBS=$LIBS" -lcuda" fi From 12574245394f333126b4fa0d756336b39883b3ee Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Mon, 21 Nov 2016 11:53:31 -0800 Subject: [PATCH 05/12] protect use_cuda member declaration --- src/perftest_parameters.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/perftest_parameters.h b/src/perftest_parameters.h index 448e398..374a14b 100755 --- a/src/perftest_parameters.h +++ b/src/perftest_parameters.h @@ -389,7 +389,9 @@ struct perftest_parameters { int buff_size; int pkey_index; int raw_qos; + #ifdef HAVE_CUDA int use_cuda; + #endif char *mmap_file; unsigned long mmap_offset; /* New test params format pilot. will be used in all flags soon,. */ From 7eb0ca5419defeff7feb44d6b4f47530c82706cb Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Mon, 21 Nov 2016 11:54:49 -0800 Subject: [PATCH 06/12] add comment for use_cuda case --- src/perftest_resources.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/perftest_resources.c b/src/perftest_resources.c index 6b8b332..dcc6e4f 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -1252,6 +1252,7 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u /* Initialize buffer with random numbers */ srand(time(NULL)); #ifdef HAVE_CUDA + // CUDA memory pointers cannot be de-referenced on CPU code if (!user_param->use_cuda) #endif for (i = 0; i < ctx->buff_size; i++) { From 6cb91d0d92e0532e093dadea39601261e130824c Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Tue, 7 Nov 2017 19:13:33 -0800 Subject: [PATCH 07/12] enable testing of CUDA Unified Memory: introduce --use_cuda_um param --- src/perftest_parameters.c | 14 ++++++++++++++ src/perftest_parameters.h | 1 + src/perftest_resources.c | 30 +++++++++++++++++------------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c index 9c2bf59..807cfd8 100755 --- a/src/perftest_parameters.c +++ b/src/perftest_parameters.c @@ -433,6 +433,8 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection #ifdef HAVE_CUDA printf(" --use_cuda "); printf(" Use CUDA lib for GPU-Direct testing.\n"); + printf(" --use_cuda_um "); + printf(" Use CUDA Unified Memory for GPU-Direct testing, needs --use_cuda.\n"); #endif @@ -605,6 +607,7 @@ static void init_perftest_params(struct perftest_parameters *user_param) user_param->output = -1; #ifdef HAVE_CUDA user_param->use_cuda = 0; + user_param->use_cuda_um = 0; #endif user_param->mmap_file = NULL; user_param->mmap_offset = 0; @@ -1202,6 +1205,12 @@ static void force_dependecies(struct perftest_parameters *user_param) fprintf(stderr,"You cannot use CUDA and an mmap'd file at the same time\n"); exit(1); } + + if (user_param->use_cuda_um && !user_param->use_cuda) { + printf(RESULT_LINE); + fprintf(stderr," Need to enable CUDA support for CUDA Managed Memory\n"); + exit(1); + } #endif if ( (user_param->connection_type == UD) && (user_param->inline_size > MAX_INLINE_UD) ) { @@ -1538,6 +1547,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) static int use_exp_flag = 0; #ifdef HAVE_CUDA static int use_cuda_flag = 0; + static int use_cuda_um_flag = 0; #endif static int mmap_file_flag = 0; static int mmap_offset_flag = 0; @@ -1636,6 +1646,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) { .name = "dont_xchg_versions", .has_arg = 0, .flag = &dont_xchg_versions_flag, .val = 1}, #ifdef HAVE_CUDA { .name = "use_cuda", .has_arg = 0, .flag = &use_cuda_flag, .val = 1}, + { .name = "use_cuda_um", .has_arg = 0, .flag = &use_cuda_um_flag, .val = 1}, #endif { .name = "mmap", .has_arg = 1, .flag = &mmap_file_flag, .val = 1}, { .name = "mmap-offset", .has_arg = 1, .flag = &mmap_offset_flag, .val = 1}, @@ -2061,6 +2072,9 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) if (use_cuda_flag) { user_param->use_cuda = 1; } + if (use_cuda_um_flag) { + user_param->use_cuda_um = 1; + } #endif if (report_both_flag) { user_param->report_both = 1; diff --git a/src/perftest_parameters.h b/src/perftest_parameters.h index 374a14b..cbefcee 100755 --- a/src/perftest_parameters.h +++ b/src/perftest_parameters.h @@ -391,6 +391,7 @@ struct perftest_parameters { int raw_qos; #ifdef HAVE_CUDA int use_cuda; + int use_cuda_um; #endif char *mmap_file; unsigned long mmap_offset; diff --git a/src/perftest_resources.c b/src/perftest_resources.c index dcc6e4f..5706109 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -53,7 +53,7 @@ struct check_alive_data check_alive_data; static CUdevice cuDevice; static CUcontext cuContext; -static int pp_init_gpu(struct pingpong_context *ctx, size_t _size) +static int pp_init_gpu(struct pingpong_context *ctx, size_t _size, int use_um) { const size_t gpu_page_size = 64*1024; size_t size = (_size + gpu_page_size - 1) & ~(gpu_page_size - 1); @@ -104,17 +104,21 @@ static int pp_init_gpu(struct pingpong_context *ctx, size_t _size) } printf("cuMemAlloc() of a %zd bytes GPU buffer\n", size); - CUdeviceptr d_A; - error = cuMemAlloc(&d_A, size); - if (error != CUDA_SUCCESS) { - printf("cuMemAlloc error=%d\n", error); - return 1; - } - printf("allocated GPU buffer address at %016llx pointer=%p\n", d_A, - (void *) d_A); - ctx->buf[0] = (void*)d_A; - - return 0; + CUdeviceptr d_A; + if (use_um) { + error = cuMemAllocManaged(&d_A, size, CU_MEM_ATTACH_GLOBAL); + } else { + error = cuMemAlloc(&d_A, size); + } + if (error != CUDA_SUCCESS) { + printf("CUDA allocation failed with error=%d\n", error); + ctx->buf[0] = NULL; + return 1; + } + printf("allocated GPU buffer address at %016llx\n", d_A); + ctx->buf[0] = (void*)d_A; + + return 0; } static int pp_free_gpu(struct pingpong_context *ctx) @@ -1157,7 +1161,7 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u #ifdef HAVE_CUDA if (user_param->use_cuda) { ctx->is_contig_supported = FAILURE; - if(pp_init_gpu(ctx, ctx->buff_size)) { + if(pp_init_gpu(ctx, ctx->buff_size, user_param->use_cuda_um)) { fprintf(stderr, "Couldn't allocate work buf.\n"); return 1; } From 088a4590d5985675fb540df3549bd448ec56167c Mon Sep 17 00:00:00 2001 From: Sylvain Jeaugey Date: Wed, 3 Jan 2018 16:33:47 -0800 Subject: [PATCH 08/12] Enable latency benchmarks with CUDA. Not working with ib_write_lat. --- src/perftest_parameters.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c index 807cfd8..c278a95 100755 --- a/src/perftest_parameters.c +++ b/src/perftest_parameters.c @@ -1192,14 +1192,6 @@ static void force_dependecies(struct perftest_parameters *user_param) #endif #ifdef HAVE_CUDA - if (user_param->use_cuda) { - if (user_param->tst != BW) { - printf(RESULT_LINE); - fprintf(stderr," Perftest supports CUDA only in BW tests\n"); - exit(1); - } - } - if (user_param->use_cuda && user_param->mmap_file != NULL) { printf(RESULT_LINE); fprintf(stderr,"You cannot use CUDA and an mmap'd file at the same time\n"); @@ -1501,19 +1493,16 @@ static void ctx_set_max_inline(struct ibv_context *context,struct perftest_param } if (user_param->inline_size == DEF_INLINE) { - - if (user_param->tst ==LAT) { + user_param->inline_size = 0; + if (user_param->tst ==LAT && user_param->use_cuda == 0) { switch(user_param->verb) { - case WRITE: user_param->inline_size = (user_param->connection_type == DC)? DEF_INLINE_DC : DEF_INLINE_WRITE; break; case SEND : user_param->inline_size = (user_param->connection_type == DC)? DEF_INLINE_DC : (user_param->connection_type == UD)? DEF_INLINE_SEND_UD : ((user_param->connection_type == XRC) ? DEF_INLINE_SEND_XRC : DEF_INLINE_SEND_RC_UC) ; break; default : user_param->inline_size = 0; } - } else { - user_param->inline_size = 0; } } From e8328875881dfec053850cf5a4e0b5656baa49dc Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Wed, 21 Feb 2018 16:02:44 -0800 Subject: [PATCH 09/12] print when --odp is passed --- src/perftest_parameters.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c index c278a95..d6a1e1c 100755 --- a/src/perftest_parameters.c +++ b/src/perftest_parameters.c @@ -1041,6 +1041,10 @@ static void force_dependecies(struct perftest_parameters *user_param) } } + if (user_param->use_odp) { + fprintf(stdout," ODP enabled\n"); + } + if(user_param->verb == ATOMIC && user_param->use_odp) { printf(RESULT_LINE); fprintf(stderr," ODP does not support ATOMICS for now\n"); From bbbe740c534e163d3f6541a2a25af66dd74179ea Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Wed, 7 Mar 2018 14:48:25 -0800 Subject: [PATCH 10/12] dump GPU BDF infos, fix use of GPU id instead of CUdevice --- src/perftest_resources.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/perftest_resources.c b/src/perftest_resources.c index 5706109..e9dd9ad 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -79,15 +79,19 @@ static int pp_init_gpu(struct pingpong_context *ctx, size_t _size, int use_um) else printf("There are %d devices supporting CUDA, picking first...\n", deviceCount); - int devID = 0; + int gpuID = 0; - /* pick up device with zero ordinal (default, or devID) */ - CUCHECK(cuDeviceGet(&cuDevice, devID)); + /* pick up device with zero ordinal (default, or gpuID) */ + CUCHECK(cuDeviceGet(&cuDevice, gpuID)); char name[128]; - CUCHECK(cuDeviceGetName(name, sizeof(name), devID)); - printf("[pid = %d, dev = %d] device name = [%s]\n", getpid(), cuDevice, name); - printf("creating CUDA Ctx\n"); + int pciDomainID, pciBusID, pciDeviceID; + CUCHECK(cuDeviceGetName(name, sizeof(name), cuDevice)); + CUCHECK(cuDeviceGetAttribute(&pciDomainID, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cuDevice)); + CUCHECK(cuDeviceGetAttribute(&pciBusID, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cuDevice)); + CUCHECK(cuDeviceGetAttribute(&pciDeviceID, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cuDevice)); + printf("[pid=%d id=%d dev=%d] GPU name=[%s] PCI Domain/Bus/Dev: %d/%d/%d\n", + getpid(), gpuID, cuDevice, name, pciDomainID, pciBusID, pciDeviceID); /* Create context */ error = cuCtxCreate(&cuContext, CU_CTX_MAP_HOST, cuDevice); From 178f35008dde445240a71060074648e578a3b8f1 Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Wed, 7 Mar 2018 15:16:58 -0800 Subject: [PATCH 11/12] pad BDF appropriately add error checking for cuMemFree --- src/perftest_resources.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/perftest_resources.c b/src/perftest_resources.c index e9dd9ad..13d31ca 100755 --- a/src/perftest_resources.c +++ b/src/perftest_resources.c @@ -90,7 +90,7 @@ static int pp_init_gpu(struct pingpong_context *ctx, size_t _size, int use_um) CUCHECK(cuDeviceGetAttribute(&pciDomainID, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cuDevice)); CUCHECK(cuDeviceGetAttribute(&pciBusID, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cuDevice)); CUCHECK(cuDeviceGetAttribute(&pciDeviceID, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cuDevice)); - printf("[pid=%d id=%d dev=%d] GPU name=[%s] PCI Domain/Bus/Dev: %d/%d/%d\n", + printf("[pid=%d id=%d dev=%d] GPU name=[%s] PCI Domain/Bus/Dev: %04x/%02x/%02x\n", getpid(), gpuID, cuDevice, name, pciDomainID, pciBusID, pciDeviceID); /* Create context */ @@ -131,7 +131,7 @@ static int pp_free_gpu(struct pingpong_context *ctx) CUdeviceptr d_A = (CUdeviceptr) ctx->buf[0]; printf("deallocating RX GPU buffer\n"); - cuMemFree(d_A); + CUCHECK(cuMemFree(d_A)); d_A = 0; printf("destroying current CUDA Ctx\n"); From 8fbf1197819b2787ba4134ba148c0c6ad12c01ed Mon Sep 17 00:00:00 2001 From: Davide Rossetti Date: Tue, 13 Mar 2018 09:58:58 -0700 Subject: [PATCH 12/12] fix !CUDA build --- src/perftest_parameters.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c index d6a1e1c..4cc3222 100755 --- a/src/perftest_parameters.c +++ b/src/perftest_parameters.c @@ -1498,7 +1498,11 @@ static void ctx_set_max_inline(struct ibv_context *context,struct perftest_param if (user_param->inline_size == DEF_INLINE) { user_param->inline_size = 0; - if (user_param->tst ==LAT && user_param->use_cuda == 0) { + if (user_param->tst == LAT + #ifdef HAVE_CUDA + && user_param->use_cuda == 0 + #endif + ) { switch(user_param->verb) { case WRITE: user_param->inline_size = (user_param->connection_type == DC)? DEF_INLINE_DC : DEF_INLINE_WRITE; break;