From a2fe9711844b72356ee792c255d1f2faa38c83b9 Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Thu, 4 Aug 2022 14:39:52 -0700 Subject: [PATCH 01/10] ofi: changed needed to enable cxi Signed-off-by: Md Rahman --- configure.ac | 6 ++++ src/shmem_synchronization.h | 2 +- src/transport_ofi.c | 69 ++++++++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/configure.ac b/configure.ac index 99112ca9a..a0efa94f1 100755 --- a/configure.ac +++ b/configure.ac @@ -208,6 +208,12 @@ AS_CASE([$enable_ofi_mr], AC_DEFINE([ENABLE_MR_SCALABLE], [1], [If defined, the OFI transport will use FI_MR_SCALABLE])], [AC_MSG_ERROR([Invalid OFI memory registration mode: $enable_ofi_mr])]) +AC_ARG_ENABLE([mr-endpoint], + [AC_HELP_STRING([--enable-mr-endpoint], + [Use FI_MR_ENDPOINT to enable cxi provider. (default: disabled)])]) +AS_IF([test "$enable_mr_endpoint" = "yes"], + [AC_DEFINE([ENABLE_MR_ENDPOINT], [1], [If defined, the OFI will use FI_MR_ENDPOINT during fi_mr_reg. Otherwise, the basic memory registration will be used.])]) + AC_ARG_ENABLE([max-teams], [AC_HELP_STRING([--enable-max-teams=NUMBER], [Default value for the maximum number of teams allowed (default: 10)])]) diff --git a/src/shmem_synchronization.h b/src/shmem_synchronization.h index 7a3eafc31..570a73b0e 100644 --- a/src/shmem_synchronization.h +++ b/src/shmem_synchronization.h @@ -174,7 +174,7 @@ shmem_internal_fence(shmem_ctx_t ctx) } \ } while(0) -#if defined(ENABLE_HARD_POLLING) +#if defined(ENABLE_HARD_POLLING) || defined(ENABLE_MR_ENDPOINT) #define SHMEM_INTERNAL_WAIT_UNTIL(var, cond, value) \ SHMEM_WAIT_UNTIL_POLL(var, cond, value) #define SHMEM_INTERNAL_SIGNAL_WAIT_UNTIL(var, cond, value, sat_value) \ diff --git a/src/transport_ofi.c b/src/transport_ofi.c index 46a67bb19..2a94c8e00 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -678,15 +678,17 @@ int allocate_recv_cntr_mr(void) /* Register separate data and heap segments using keys 0 and 1, * respectively. In MR_BASIC_MODE, the keys are ignored and selected by * the provider. */ + uint64_t key = 1; ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_heap_base, shmem_internal_heap_length, - FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 1ULL, flags, + FI_REMOTE_READ | FI_REMOTE_WRITE, 0, key, flags, &shmem_transport_ofi_target_heap_mrfd, NULL); OFI_CHECK_RETURN_STR(ret, "target memory (heap) registration failed"); + key = 0; ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_data_base, shmem_internal_data_length, - FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 0ULL, flags, + FI_REMOTE_READ | FI_REMOTE_WRITE, 0, key, flags, &shmem_transport_ofi_target_data_mrfd, NULL); OFI_CHECK_RETURN_STR(ret, "target memory (data) registration failed"); @@ -702,6 +704,28 @@ int allocate_recv_cntr_mr(void) FI_REMOTE_WRITE); OFI_CHECK_RETURN_STR(ret, "target CNTR binding to data MR failed"); +#ifdef ENABLE_MR_ENDPOINT + if (shmem_transport_ofi_info.p_info->domain_attr->mr_mode & FI_MR_ENDPOINT) { + ret = fi_ep_bind(shmem_transport_ofi_target_ep, + &shmem_transport_ofi_target_cntrfd->fid, FI_REMOTE_WRITE); + OFI_CHECK_RETURN_STR(ret, "target EP binding to target counter failed"); + + ret = fi_mr_bind(shmem_transport_ofi_target_heap_mrfd, + &shmem_transport_ofi_target_ep->fid, FI_REMOTE_WRITE); + OFI_CHECK_RETURN_STR(ret, "target EP binding to heap MR failed"); + + ret = fi_mr_enable(shmem_transport_ofi_target_heap_mrfd); + OFI_CHECK_RETURN_STR(ret, "target heap MR enable failed"); + + ret = fi_mr_bind(shmem_transport_ofi_target_data_mrfd, + &shmem_transport_ofi_target_ep->fid, FI_REMOTE_WRITE); + OFI_CHECK_RETURN_STR(ret, "target CNTR binding to data MR failed"); + + ret = fi_mr_enable(shmem_transport_ofi_target_data_mrfd); + OFI_CHECK_RETURN_STR(ret, "target data MR enable failed"); + } +#endif + #ifdef ENABLE_MR_RMA_EVENT if (shmem_transport_ofi_mr_rma_event) { ret = fi_mr_enable(shmem_transport_ofi_target_data_mrfd); @@ -729,8 +753,8 @@ int publish_mr_info(void) heap_key = fi_mr_key(shmem_transport_ofi_target_heap_mrfd); data_key = fi_mr_key(shmem_transport_ofi_target_data_mrfd); } else { - heap_key = 1ULL; - data_key = 0ULL; + heap_key = 1; + data_key = 0; } err = shmem_runtime_put("fi_heap_key", &heap_key, sizeof(uint64_t)); @@ -1155,7 +1179,7 @@ int query_for_fabric(struct fabric_info *info) for put with signal implementation */ #endif hints.addr_format = FI_FORMAT_UNSPEC; - domain_attr.data_progress = FI_PROGRESS_AUTO; + domain_attr.data_progress = FI_PROGRESS_MANUAL; domain_attr.resource_mgmt = FI_RM_ENABLED; #ifdef ENABLE_MR_SCALABLE /* Scalable, offset-based addressing, formerly FI_MR_SCALABLE */ @@ -1166,6 +1190,9 @@ int query_for_fabric(struct fabric_info *info) #else /* Portable, absolute addressing, formerly FI_MR_BASIC */ domain_attr.mr_mode = FI_MR_VIRT_ADDR | FI_MR_ALLOCATED | FI_MR_PROV_KEY; +#ifdef ENABLE_MR_ENDPOINT + domain_attr.mr_mode |= FI_MR_ENDPOINT; +#endif #endif #if !defined(ENABLE_MR_SCALABLE) || !defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) domain_attr.mr_key_size = 1; /* Heap and data use different MR keys, need @@ -1299,22 +1326,22 @@ static int shmem_transport_ofi_target_ep_init(void) ret = fi_ep_bind(shmem_transport_ofi_target_ep, &shmem_transport_ofi_avfd->fid, 0); OFI_CHECK_RETURN_STR(ret, "fi_ep_bind AV to target endpoint failed"); - ret = allocate_recv_cntr_mr(); - if (ret != 0) return ret; - - struct fi_cq_attr cq_attr = {0}; + struct fi_cq_attr cq_attr = {0}; - ret = fi_cq_open(shmem_transport_ofi_domainfd, &cq_attr, - &shmem_transport_ofi_target_cq, NULL); - OFI_CHECK_RETURN_MSG(ret, "cq_open failed (%s)\n", fi_strerror(errno)); + ret = fi_cq_open(shmem_transport_ofi_domainfd, &cq_attr, + &shmem_transport_ofi_target_cq, NULL); + OFI_CHECK_RETURN_MSG(ret, "cq_open failed (%s)\n", fi_strerror(errno)); - ret = fi_ep_bind(shmem_transport_ofi_target_ep, - &shmem_transport_ofi_target_cq->fid, FI_RECV); - OFI_CHECK_RETURN_STR(ret, "fi_ep_bind CQ to target endpoint failed"); + ret = fi_ep_bind(shmem_transport_ofi_target_ep, + &shmem_transport_ofi_target_cq->fid, FI_TRANSMIT | FI_RECV); + OFI_CHECK_RETURN_STR(ret, "fi_ep_bind CQ to target endpoint failed"); ret = fi_enable(shmem_transport_ofi_target_ep); OFI_CHECK_RETURN_STR(ret, "fi_enable on target endpoint failed"); + ret = allocate_recv_cntr_mr(); + if (ret) return ret; + return 0; } @@ -1782,12 +1809,6 @@ int shmem_transport_fini(void) } if (shmem_transport_ofi_stx_pool) free(shmem_transport_ofi_stx_pool); - ret = fi_close(&shmem_transport_ofi_target_ep->fid); - OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); - - ret = fi_close(&shmem_transport_ofi_target_cq->fid); - OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); - #if defined(ENABLE_MR_SCALABLE) && defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) ret = fi_close(&shmem_transport_ofi_target_mrfd->fid); OFI_CHECK_ERROR_MSG(ret, "Target MR close failed (%s)\n", fi_strerror(errno)); @@ -1799,6 +1820,12 @@ int shmem_transport_fini(void) OFI_CHECK_ERROR_MSG(ret, "Target data MR close failed (%s)\n", fi_strerror(errno)); #endif + ret = fi_close(&shmem_transport_ofi_target_ep->fid); + OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); + + ret = fi_close(&shmem_transport_ofi_target_cq->fid); + OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); + #if ENABLE_TARGET_CNTR ret = fi_close(&shmem_transport_ofi_target_cntrfd->fid); OFI_CHECK_ERROR_MSG(ret, "Target CT close failed (%s)\n", fi_strerror(errno)); From d96e637e6ff8afacf73d5617374d02112eb765e4 Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Thu, 4 Aug 2022 14:57:54 -0700 Subject: [PATCH 02/10] ofi: defined keys separately for FI_MR_ENDPOINT --- src/transport_ofi.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index 2a94c8e00..2d26b66fe 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -678,6 +678,7 @@ int allocate_recv_cntr_mr(void) /* Register separate data and heap segments using keys 0 and 1, * respectively. In MR_BASIC_MODE, the keys are ignored and selected by * the provider. */ +#ifdef ENABLE_MR_ENDPOINT uint64_t key = 1; ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_heap_base, shmem_internal_heap_length, @@ -691,6 +692,19 @@ int allocate_recv_cntr_mr(void) FI_REMOTE_READ | FI_REMOTE_WRITE, 0, key, flags, &shmem_transport_ofi_target_data_mrfd, NULL); OFI_CHECK_RETURN_STR(ret, "target memory (data) registration failed"); +#else + ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_heap_base, + shmem_internal_heap_length, + FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 1ULL, flags, + &shmem_transport_ofi_target_heap_mrfd, NULL); + OFI_CHECK_RETURN_STR(ret, "target memory (heap) registration failed"); + + ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_data_base, + shmem_internal_data_length, + FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 0ULL, flags, + &shmem_transport_ofi_target_data_mrfd, NULL); + OFI_CHECK_RETURN_STR(ret, "target memory (data) registration failed"); +#endif /* Bind counter with target memory region for incoming messages */ #if ENABLE_TARGET_CNTR @@ -753,8 +767,13 @@ int publish_mr_info(void) heap_key = fi_mr_key(shmem_transport_ofi_target_heap_mrfd); data_key = fi_mr_key(shmem_transport_ofi_target_data_mrfd); } else { +#ifdef ENABLE_MR_ENDPOINT heap_key = 1; data_key = 0; +#else + heap_key = 1ULL; + data_key = 0ULL; +#endif } err = shmem_runtime_put("fi_heap_key", &heap_key, sizeof(uint64_t)); From f95afa84ec26ce774cb8a78a1f06d5eafe73d43a Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Fri, 5 Aug 2022 08:39:22 -0700 Subject: [PATCH 03/10] ofi: added explicit ordering of mr_reg for MR_ENDPOINT --- src/transport_ofi.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index 2d26b66fe..d50c6b6db 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -1345,6 +1345,11 @@ static int shmem_transport_ofi_target_ep_init(void) ret = fi_ep_bind(shmem_transport_ofi_target_ep, &shmem_transport_ofi_avfd->fid, 0); OFI_CHECK_RETURN_STR(ret, "fi_ep_bind AV to target endpoint failed"); +#ifndef ENABLE_MR_ENDPOINT + ret = allocate_recv_cntr_mr(); + if (ret) return ret; +#endif + struct fi_cq_attr cq_attr = {0}; ret = fi_cq_open(shmem_transport_ofi_domainfd, &cq_attr, @@ -1358,8 +1363,10 @@ static int shmem_transport_ofi_target_ep_init(void) ret = fi_enable(shmem_transport_ofi_target_ep); OFI_CHECK_RETURN_STR(ret, "fi_enable on target endpoint failed"); +#ifdef ENABLE_MR_ENDPOINT ret = allocate_recv_cntr_mr(); if (ret) return ret; +#endif return 0; } @@ -1828,6 +1835,14 @@ int shmem_transport_fini(void) } if (shmem_transport_ofi_stx_pool) free(shmem_transport_ofi_stx_pool); +#ifndef ENABLE_MR_ENDPOINT + ret = fi_close(&shmem_transport_ofi_target_ep->fid); + OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); + + ret = fi_close(&shmem_transport_ofi_target_cq->fid); + OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); +#endif + #if defined(ENABLE_MR_SCALABLE) && defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) ret = fi_close(&shmem_transport_ofi_target_mrfd->fid); OFI_CHECK_ERROR_MSG(ret, "Target MR close failed (%s)\n", fi_strerror(errno)); @@ -1839,11 +1854,13 @@ int shmem_transport_fini(void) OFI_CHECK_ERROR_MSG(ret, "Target data MR close failed (%s)\n", fi_strerror(errno)); #endif +#ifdef ENABLE_MR_ENDPOINT ret = fi_close(&shmem_transport_ofi_target_ep->fid); OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); ret = fi_close(&shmem_transport_ofi_target_cq->fid); OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); +#endif #if ENABLE_TARGET_CNTR ret = fi_close(&shmem_transport_ofi_target_cntrfd->fid); From bacfd3cc9d345ff99a16b6e6e8e31bc20060065c Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Fri, 5 Aug 2022 13:16:06 -0700 Subject: [PATCH 04/10] ofi: guarded data progress assignment for endpoint MR --- src/transport_ofi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index d50c6b6db..a6c84a378 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -1198,7 +1198,11 @@ int query_for_fabric(struct fabric_info *info) for put with signal implementation */ #endif hints.addr_format = FI_FORMAT_UNSPEC; +#ifdef ENABLE_MR_ENDPOINT domain_attr.data_progress = FI_PROGRESS_MANUAL; +#else + domain_attr.data_progress = FI_PROGRESS_AUTO; +#endif domain_attr.resource_mgmt = FI_RM_ENABLED; #ifdef ENABLE_MR_SCALABLE /* Scalable, offset-based addressing, formerly FI_MR_SCALABLE */ From fc04e0e41f8a2fb4742253fab4794c699b516a3a Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Fri, 5 Aug 2022 14:50:20 -0700 Subject: [PATCH 05/10] ofi: unified the ordering of mr_reg w.r.t. others --- src/transport_ofi.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index a6c84a378..0c5342915 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -1349,11 +1349,6 @@ static int shmem_transport_ofi_target_ep_init(void) ret = fi_ep_bind(shmem_transport_ofi_target_ep, &shmem_transport_ofi_avfd->fid, 0); OFI_CHECK_RETURN_STR(ret, "fi_ep_bind AV to target endpoint failed"); -#ifndef ENABLE_MR_ENDPOINT - ret = allocate_recv_cntr_mr(); - if (ret) return ret; -#endif - struct fi_cq_attr cq_attr = {0}; ret = fi_cq_open(shmem_transport_ofi_domainfd, &cq_attr, @@ -1367,10 +1362,8 @@ static int shmem_transport_ofi_target_ep_init(void) ret = fi_enable(shmem_transport_ofi_target_ep); OFI_CHECK_RETURN_STR(ret, "fi_enable on target endpoint failed"); -#ifdef ENABLE_MR_ENDPOINT ret = allocate_recv_cntr_mr(); if (ret) return ret; -#endif return 0; } @@ -1839,14 +1832,6 @@ int shmem_transport_fini(void) } if (shmem_transport_ofi_stx_pool) free(shmem_transport_ofi_stx_pool); -#ifndef ENABLE_MR_ENDPOINT - ret = fi_close(&shmem_transport_ofi_target_ep->fid); - OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); - - ret = fi_close(&shmem_transport_ofi_target_cq->fid); - OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); -#endif - #if defined(ENABLE_MR_SCALABLE) && defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) ret = fi_close(&shmem_transport_ofi_target_mrfd->fid); OFI_CHECK_ERROR_MSG(ret, "Target MR close failed (%s)\n", fi_strerror(errno)); @@ -1858,13 +1843,11 @@ int shmem_transport_fini(void) OFI_CHECK_ERROR_MSG(ret, "Target data MR close failed (%s)\n", fi_strerror(errno)); #endif -#ifdef ENABLE_MR_ENDPOINT ret = fi_close(&shmem_transport_ofi_target_ep->fid); OFI_CHECK_ERROR_MSG(ret, "Target endpoint close failed (%s)\n", fi_strerror(errno)); ret = fi_close(&shmem_transport_ofi_target_cq->fid); OFI_CHECK_ERROR_MSG(ret, "Target CQ close failed (%s)\n", fi_strerror(errno)); -#endif #if ENABLE_TARGET_CNTR ret = fi_close(&shmem_transport_ofi_target_cntrfd->fid); From 5fd813eb2ef9a0c0cebbb74a8c31d1982d20c09b Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Fri, 16 Sep 2022 10:02:43 -0700 Subject: [PATCH 06/10] atomic: enable fetch atomic through fi_atomicmsg --- src/transport_ofi.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/transport_ofi.h b/src/transport_ofi.h index 099c6468c..e1e803c8e 100644 --- a/src/transport_ofi.h +++ b/src/transport_ofi.h @@ -1314,8 +1314,17 @@ void shmem_transport_atomic_fetch(shmem_transport_ctx_t* ctx, void *target, const void *source, size_t len, int pe, int datatype) { +#ifdef ENABLE_MR_ENDPOINT + /* CXI provider currently does not support fetch atomics with FI_DELIVERY_COMPLETE + * That is why non-blocking API is used which uses FI_INJECT. FI_ATOMIC_READ is + * also not supported currently */ + long long dummy = 0; + shmem_transport_fetch_atomic_nbi(ctx, (void *) source, (const void *) &dummy, + target, len, pe, FI_SUM, datatype); +#else shmem_transport_fetch_atomic(ctx, (void *) source, (const void *) NULL, target, len, pe, FI_ATOMIC_READ, datatype); +#endif } From 4283c6606488a35b28b3f25be45f4408c5c4b09d Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Tue, 7 Feb 2023 19:35:29 -0800 Subject: [PATCH 07/10] Updated provided key from unsigned long long type to 8 bytes; removed ifdef for mr_endpoint --- src/transport_ofi.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index 0c5342915..e73479896 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -678,7 +678,6 @@ int allocate_recv_cntr_mr(void) /* Register separate data and heap segments using keys 0 and 1, * respectively. In MR_BASIC_MODE, the keys are ignored and selected by * the provider. */ -#ifdef ENABLE_MR_ENDPOINT uint64_t key = 1; ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_heap_base, shmem_internal_heap_length, @@ -692,19 +691,6 @@ int allocate_recv_cntr_mr(void) FI_REMOTE_READ | FI_REMOTE_WRITE, 0, key, flags, &shmem_transport_ofi_target_data_mrfd, NULL); OFI_CHECK_RETURN_STR(ret, "target memory (data) registration failed"); -#else - ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_heap_base, - shmem_internal_heap_length, - FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 1ULL, flags, - &shmem_transport_ofi_target_heap_mrfd, NULL); - OFI_CHECK_RETURN_STR(ret, "target memory (heap) registration failed"); - - ret = fi_mr_reg(shmem_transport_ofi_domainfd, shmem_internal_data_base, - shmem_internal_data_length, - FI_REMOTE_READ | FI_REMOTE_WRITE, 0, 0ULL, flags, - &shmem_transport_ofi_target_data_mrfd, NULL); - OFI_CHECK_RETURN_STR(ret, "target memory (data) registration failed"); -#endif /* Bind counter with target memory region for incoming messages */ #if ENABLE_TARGET_CNTR @@ -1213,10 +1199,10 @@ int query_for_fabric(struct fabric_info *info) #else /* Portable, absolute addressing, formerly FI_MR_BASIC */ domain_attr.mr_mode = FI_MR_VIRT_ADDR | FI_MR_ALLOCATED | FI_MR_PROV_KEY; +#endif #ifdef ENABLE_MR_ENDPOINT domain_attr.mr_mode |= FI_MR_ENDPOINT; #endif -#endif #if !defined(ENABLE_MR_SCALABLE) || !defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) domain_attr.mr_key_size = 1; /* Heap and data use different MR keys, need at least 1 byte */ From 7447a5fc51486153e23ae743f35b52ef0f83fe7a Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Wed, 8 Feb 2023 13:06:45 -0800 Subject: [PATCH 08/10] Added fi-manual-progress build flag --- configure.ac | 9 ++++++++- src/shmem_synchronization.h | 2 +- src/transport_ofi.c | 7 +------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index a0efa94f1..a6b96d214 100755 --- a/configure.ac +++ b/configure.ac @@ -212,7 +212,14 @@ AC_ARG_ENABLE([mr-endpoint], [AC_HELP_STRING([--enable-mr-endpoint], [Use FI_MR_ENDPOINT to enable cxi provider. (default: disabled)])]) AS_IF([test "$enable_mr_endpoint" = "yes"], - [AC_DEFINE([ENABLE_MR_ENDPOINT], [1], [If defined, the OFI will use FI_MR_ENDPOINT during fi_mr_reg. Otherwise, the basic memory registration will be used.])]) + [AC_DEFINE([ENABLE_MR_ENDPOINT], [1], [If defined, the OFI transport will use FI_MR_ENDPOINT])]) + +AC_ARG_ENABLE([fi-manual-progress], + [AC_HELP_STRING([--enable-fi-manual-progress], + [Use FI_MANUAL_PROGRESS for data progress control mode. (default: disabled)])]) +AS_IF([test "$enable_fi_manual_progress" = "yes"], + [AC_DEFINE([ENABLE_FI_MANUAL_PROGRESS], [1], [If defined, the OFI will use FI_MANUAL_PROGRESS as data progress mode. This is currently required for cxi provider.])]) + AC_ARG_ENABLE([max-teams], [AC_HELP_STRING([--enable-max-teams=NUMBER], diff --git a/src/shmem_synchronization.h b/src/shmem_synchronization.h index 570a73b0e..074eccf37 100644 --- a/src/shmem_synchronization.h +++ b/src/shmem_synchronization.h @@ -174,7 +174,7 @@ shmem_internal_fence(shmem_ctx_t ctx) } \ } while(0) -#if defined(ENABLE_HARD_POLLING) || defined(ENABLE_MR_ENDPOINT) +#if defined(ENABLE_HARD_POLLING) || defined(ENABLE_FI_MANUAL_PROGRESS) #define SHMEM_INTERNAL_WAIT_UNTIL(var, cond, value) \ SHMEM_WAIT_UNTIL_POLL(var, cond, value) #define SHMEM_INTERNAL_SIGNAL_WAIT_UNTIL(var, cond, value, sat_value) \ diff --git a/src/transport_ofi.c b/src/transport_ofi.c index e73479896..457c9e785 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -753,13 +753,8 @@ int publish_mr_info(void) heap_key = fi_mr_key(shmem_transport_ofi_target_heap_mrfd); data_key = fi_mr_key(shmem_transport_ofi_target_data_mrfd); } else { -#ifdef ENABLE_MR_ENDPOINT heap_key = 1; data_key = 0; -#else - heap_key = 1ULL; - data_key = 0ULL; -#endif } err = shmem_runtime_put("fi_heap_key", &heap_key, sizeof(uint64_t)); @@ -1184,7 +1179,7 @@ int query_for_fabric(struct fabric_info *info) for put with signal implementation */ #endif hints.addr_format = FI_FORMAT_UNSPEC; -#ifdef ENABLE_MR_ENDPOINT +#ifdef ENABLE_FI_MANUAL_PROGRESS domain_attr.data_progress = FI_PROGRESS_MANUAL; #else domain_attr.data_progress = FI_PROGRESS_AUTO; From e9592a566a3699b974293b6f3521034c6d5b4ef7 Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Wed, 8 Feb 2023 14:41:19 -0800 Subject: [PATCH 09/10] Minor: comments, error messages --- configure.ac | 1 - src/shmem_synchronization.h | 3 +++ src/transport_ofi.c | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index a6b96d214..82b3e1c68 100755 --- a/configure.ac +++ b/configure.ac @@ -220,7 +220,6 @@ AC_ARG_ENABLE([fi-manual-progress], AS_IF([test "$enable_fi_manual_progress" = "yes"], [AC_DEFINE([ENABLE_FI_MANUAL_PROGRESS], [1], [If defined, the OFI will use FI_MANUAL_PROGRESS as data progress mode. This is currently required for cxi provider.])]) - AC_ARG_ENABLE([max-teams], [AC_HELP_STRING([--enable-max-teams=NUMBER], [Default value for the maximum number of teams allowed (default: 10)])]) diff --git a/src/shmem_synchronization.h b/src/shmem_synchronization.h index 074eccf37..0270d6d7b 100644 --- a/src/shmem_synchronization.h +++ b/src/shmem_synchronization.h @@ -174,6 +174,9 @@ shmem_internal_fence(shmem_ctx_t ctx) } \ } while(0) +/* Polling based wait is required for providers that need + * manual progress, i.e., cxi. This is enabled through + * ENABLE_FI_MANUAL_PROGRESS */ #if defined(ENABLE_HARD_POLLING) || defined(ENABLE_FI_MANUAL_PROGRESS) #define SHMEM_INTERNAL_WAIT_UNTIL(var, cond, value) \ SHMEM_WAIT_UNTIL_POLL(var, cond, value) diff --git a/src/transport_ofi.c b/src/transport_ofi.c index 457c9e785..7e605f369 100644 --- a/src/transport_ofi.c +++ b/src/transport_ofi.c @@ -708,7 +708,7 @@ int allocate_recv_cntr_mr(void) if (shmem_transport_ofi_info.p_info->domain_attr->mr_mode & FI_MR_ENDPOINT) { ret = fi_ep_bind(shmem_transport_ofi_target_ep, &shmem_transport_ofi_target_cntrfd->fid, FI_REMOTE_WRITE); - OFI_CHECK_RETURN_STR(ret, "target EP binding to target counter failed"); + OFI_CHECK_RETURN_STR(ret, "target CNTR binding to target EP failed"); ret = fi_mr_bind(shmem_transport_ofi_target_heap_mrfd, &shmem_transport_ofi_target_ep->fid, FI_REMOTE_WRITE); @@ -719,7 +719,7 @@ int allocate_recv_cntr_mr(void) ret = fi_mr_bind(shmem_transport_ofi_target_data_mrfd, &shmem_transport_ofi_target_ep->fid, FI_REMOTE_WRITE); - OFI_CHECK_RETURN_STR(ret, "target CNTR binding to data MR failed"); + OFI_CHECK_RETURN_STR(ret, "target EP binding to data MR failed"); ret = fi_mr_enable(shmem_transport_ofi_target_data_mrfd); OFI_CHECK_RETURN_STR(ret, "target data MR enable failed"); From f62c0eae047cedfe8b9f089d4bc092ddb5c2d8e1 Mon Sep 17 00:00:00 2001 From: Md Rahman Date: Thu, 9 Feb 2023 20:10:43 -0800 Subject: [PATCH 10/10] Update config flag to ofi_manual_progress --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 82b3e1c68..76ec09546 100755 --- a/configure.ac +++ b/configure.ac @@ -214,10 +214,10 @@ AC_ARG_ENABLE([mr-endpoint], AS_IF([test "$enable_mr_endpoint" = "yes"], [AC_DEFINE([ENABLE_MR_ENDPOINT], [1], [If defined, the OFI transport will use FI_MR_ENDPOINT])]) -AC_ARG_ENABLE([fi-manual-progress], - [AC_HELP_STRING([--enable-fi-manual-progress], +AC_ARG_ENABLE([ofi-manual-progress], + [AC_HELP_STRING([--enable-ofi-manual-progress], [Use FI_MANUAL_PROGRESS for data progress control mode. (default: disabled)])]) -AS_IF([test "$enable_fi_manual_progress" = "yes"], +AS_IF([test "$enable_ofi_manual_progress" = "yes"], [AC_DEFINE([ENABLE_FI_MANUAL_PROGRESS], [1], [If defined, the OFI will use FI_MANUAL_PROGRESS as data progress mode. This is currently required for cxi provider.])]) AC_ARG_ENABLE([max-teams],