From 11d79d1f6ec6d253d01648c9b19854287daa09d5 Mon Sep 17 00:00:00 2001 From: Geoffrey Paulsen Date: Mon, 24 Feb 2020 12:13:20 -0500 Subject: [PATCH] Updating OMPI v4.0.x to PMIx v3.1.5 released Signed-off-by: Geoffrey Paulsen --- opal/mca/pmix/pmix3x/pmix/NEWS | 7 +- opal/mca/pmix/pmix3x/pmix/VERSION | 12 +- .../pmix3x/pmix/config/pmix_check_vendor.m4 | 18 +- opal/mca/pmix/pmix3x/pmix/contrib/pmix.spec | 2 +- .../pmix3x/pmix/src/client/pmix_client_get.c | 263 ++++++++++++------ .../pmix3x/pmix/src/include/pmix_globals.c | 4 + .../pmix3x/pmix/src/include/pmix_globals.h | 5 + .../mca/pmix/pmix3x/pmix/src/tool/pmix_tool.c | 11 +- 8 files changed, 216 insertions(+), 106 deletions(-) diff --git a/opal/mca/pmix/pmix3x/pmix/NEWS b/opal/mca/pmix/pmix3x/pmix/NEWS index 8b102555cb..ca24124edb 100644 --- a/opal/mca/pmix/pmix3x/pmix/NEWS +++ b/opal/mca/pmix/pmix3x/pmix/NEWS @@ -1,4 +1,4 @@ -Copyright (c) 2015-2019 Intel, Inc. All rights reserved. +Copyright (c) 2015-2020 Intel, Inc. All rights reserved. Copyright (c) 2017-2020 IBM Corporation. All rights reserved. $COPYRIGHT$ @@ -58,6 +58,11 @@ in accordance with an Errata update of the PMIx v3 Standard - PR #1613: dstore: Fix cache size calculation - PR #1622: Fix multiple occurrences of unaligned access in pmix tests - PR #1620: Re-address the collective tracker problem +- PR #1625: Fix library triplet +- PR #1630: Fix support for PGI compiler pgcc18 +- PR #1637: Realign behavior of PMIx_Get and PMIx_Get_nb +- PR #1640: Properly handle forwarded output when no handler registered + 3.1.4 -- 9 Aug 2019 diff --git a/opal/mca/pmix/pmix3x/pmix/VERSION b/opal/mca/pmix/pmix3x/pmix/VERSION index f3fb512ecf..ff271b549f 100644 --- a/opal/mca/pmix/pmix3x/pmix/VERSION +++ b/opal/mca/pmix/pmix3x/pmix/VERSION @@ -25,14 +25,14 @@ release=5 # The only requirement is that it must be entirely printable ASCII # characters and have no white space. -greek=rc2 +greek= # If repo_rev is empty, then the repository version number will be # obtained during "make dist" via the "git describe --tags --always" # command, or with the date (if "git describe" fails) in the form of # "date". -repo_rev=git1fca232 +repo_rev=gitedebb24 # If tarball_version is not empty, it is used as the version string in # the tarball filename, regardless of all other versions listed in @@ -46,7 +46,7 @@ tarball_version= # The date when this release was created -date="Feb 10, 2020" +date="Feb 19, 2020" # The shared library version of each of PMIx's public libraries. # These versions are maintained in accordance with the "Library @@ -82,8 +82,8 @@ libpmi_so_version=1:1:0 libpmi2_so_version=1:0:0 # "Common" components install standalone libraries that are run-time -# # linked by one or more components. So they need to be versioned as -# # well. Yuck; this somewhat breaks the -# # components-don't-affect-the-build-system abstraction. +# linked by one or more components. So they need to be versioned as +# well. Yuck; this somewhat breaks the +# components-don't-affect-the-build-system abstraction. # libmca_common_dstore_so_version=1:2:0 diff --git a/opal/mca/pmix/pmix3x/pmix/config/pmix_check_vendor.m4 b/opal/mca/pmix/pmix3x/pmix/config/pmix_check_vendor.m4 index cf96c46256..7c83ce1fa2 100644 --- a/opal/mca/pmix/pmix3x/pmix/config/pmix_check_vendor.m4 +++ b/opal/mca/pmix/pmix3x/pmix/config/pmix_check_vendor.m4 @@ -11,7 +11,7 @@ dnl University of Stuttgart. All rights reserved. dnl Copyright (c) 2004-2005 The Regents of the University of California. dnl All rights reserved. dnl Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. -dnl Copyright (c) 2013 Intel, Inc. All rights reserved +dnl Copyright (c) 2013-2020 Intel, Inc. All rights reserved. dnl Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. dnl Copyright (c) 2015 Research Organization for Information Science dnl and Technology (RIST). All rights reserved. @@ -45,7 +45,7 @@ AC_DEFUN([PMIX_C_COMPILER_VENDOR], [ # workaround to avoid syntax error with Autoconf < 2.68: m4_ifndef([AC_LANG_DEFINES_PROVIDED], - [m4_define([AC_LANG_DEFINES_PROVIDED])]) + [m4_define([AC_LANG_DEFINES_PROVIDED])]) # PMIX_IFDEF_IFELSE(symbol, [action-if-defined], # [action-if-not-defined]) @@ -85,14 +85,19 @@ AC_DEFUN([_PMIX_CHECK_COMPILER_VENDOR], [ pmix_check_compiler_vendor_result="unknown" # GNU is probably the most common, so check that one as soon as - # possible. Intel pretends to be GNU, so need to check Intel - # before checking for GNU. + # possible. Intel and PGI18 pretend to be GNU, so need to check Intel + # and PGI before checking for GNU. # Intel AS_IF([test "$pmix_check_compiler_vendor_result" = "unknown"], [PMIX_IF_IFELSE([defined(__INTEL_COMPILER) || defined(__ICC)], [pmix_check_compiler_vendor_result="intel"])]) + # Portland Group + AS_IF([test "$pmix_check_compiler_vendor_result" = "unknown"], + [PMIX_IFDEF_IFELSE([__PGI], + [pmix_check_compiler_vendor_result="portland group"])]) + # Fujitsu AS_IF([test "$pmix_check_compiler_vendor_result" = "unknown"], [PMIX_IF_IFELSE([defined(__FUJITSU)], @@ -212,11 +217,6 @@ AC_DEFUN([_PMIX_CHECK_COMPILER_VENDOR], [ [PMIX_IFDEF_IFELSE([__POCC__], [pmix_check_compiler_vendor_result="pelles"])]) - # Portland Group - AS_IF([test "$pmix_check_compiler_vendor_result" = "unknown"], - [PMIX_IFDEF_IFELSE([__PGI], - [pmix_check_compiler_vendor_result="portland group"])]) - # SAS/C AS_IF([test "$pmix_check_compiler_vendor_result" = "unknown"], [PMIX_IF_IFELSE([defined(SASC) || defined(__SASC) || defined(__SASC__)], diff --git a/opal/mca/pmix/pmix3x/pmix/contrib/pmix.spec b/opal/mca/pmix/pmix3x/pmix/contrib/pmix.spec index ad3e79c297..e9a263bf01 100644 --- a/opal/mca/pmix/pmix3x/pmix/contrib/pmix.spec +++ b/opal/mca/pmix/pmix3x/pmix/contrib/pmix.spec @@ -192,7 +192,7 @@ Summary: An extended/exascale implementation of PMI Name: %{?_name:%{_name}}%{!?_name:pmix} -Version: 3.1.5rc2 +Version: 3.1.5 Release: 1%{?dist} License: BSD Group: Development/Libraries diff --git a/opal/mca/pmix/pmix3x/pmix/src/client/pmix_client_get.c b/opal/mca/pmix/pmix3x/pmix/src/client/pmix_client_get.c index a2a92ae87d..3553a8a0c8 100644 --- a/opal/mca/pmix/pmix3x/pmix/src/client/pmix_client_get.c +++ b/opal/mca/pmix/pmix3x/pmix/src/client/pmix_client_get.c @@ -1,6 +1,6 @@ /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* - * Copyright (c) 2014-2019 Intel, Inc. All rights reserved. + * Copyright (c) 2014-2020 Intel, Inc. All rights reserved. * Copyright (c) 2014-2016 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2014 Artem Y. Polyakov . @@ -89,11 +89,8 @@ PMIX_EXPORT pmix_status_t PMIx_Get(const pmix_proc_t *proc, const pmix_info_t info[], size_t ninfo, pmix_value_t **val) { - pmix_cb_t *cb; + pmix_cb_t cb; pmix_status_t rc; - size_t n, nfo; - pmix_proc_t p; - pmix_info_t nodeinfo, *iptr; PMIX_ACQUIRE_THREAD(&pmix_global_lock); @@ -108,76 +105,23 @@ PMIX_EXPORT pmix_status_t PMIx_Get(const pmix_proc_t *proc, (NULL == proc) ? "NULL" : PMIX_NAME_PRINT(proc), (NULL == key) ? "NULL" : key); - memcpy(&p, proc, sizeof(pmix_proc_t)); - iptr = (pmix_info_t*)info; - nfo = ninfo; - - if (!PMIX_PEER_IS_EARLIER(pmix_client_globals.myserver, 3, 1, 5)) { - if (PMIX_RANK_UNDEF == proc->rank || NULL == key) { - goto doget; - } - /* if they are asking about a node-level piece of info, - * then the rank must be UNDEF */ - if (pmix_check_node_info(key)) { - p.rank = PMIX_RANK_UNDEF; - /* see if they told us to get node info */ - if (NULL == info) { - /* guess not - better do it */ - PMIX_INFO_LOAD(&nodeinfo, PMIX_NODE_INFO, NULL, PMIX_BOOL); - iptr = &nodeinfo; - nfo = 1; - } - goto doget; - } - /* if they are asking about an app-level piece of info, - * then the rank must be UNDEF */ - if (pmix_check_app_info(key)) { - p.rank = PMIX_RANK_UNDEF; - /* see if they told us to get app info */ - if (NULL == info) { - /* guess not - better do it */ - PMIX_INFO_LOAD(&nodeinfo, PMIX_APP_INFO, NULL, PMIX_BOOL); - iptr = &nodeinfo; - nfo = 1; - } - goto doget; - } - - /* see if they are requesting session, node, or app-level info */ - for (n=0; n < ninfo; n++) { - if (PMIX_CHECK_KEY(info, PMIX_NODE_INFO) || - PMIX_CHECK_KEY(info, PMIX_APP_INFO) || - PMIX_CHECK_KEY(info, PMIX_SESSION_INFO)) { - goto doget; - } - } - } - - /* try to get data directly, without threadshift */ - if (PMIX_SUCCESS == (rc = _getfn_fastpath(&p, key, iptr, nfo, val))) { - goto done; - } - - doget: - /* create a callback object as we need to pass it to the - * recv routine so we know which callback to use when - * the return message is recvd */ - cb = PMIX_NEW(pmix_cb_t); - if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&p, key, iptr, nfo, _value_cbfunc, cb))) { - PMIX_RELEASE(cb); + /* create a callback object so we can be notified when + * the non-blocking operation is complete */ + PMIX_CONSTRUCT(&cb, pmix_cb_t); + if (PMIX_SUCCESS != (rc = PMIx_Get_nb(proc, key, info, ninfo, _value_cbfunc, &cb))) { + PMIX_DESTRUCT(&cb); return rc; } /* wait for the data to return */ - PMIX_WAIT_THREAD(&cb->lock); - rc = cb->status; + PMIX_WAIT_THREAD(&cb.lock); + rc = cb.status; if (NULL != val) { - *val = cb->value; - cb->value = NULL; + *val = cb.value; + cb.value = NULL; } - PMIX_RELEASE(cb); + PMIX_DESTRUCT(&cb); - done: pmix_output_verbose(2, pmix_client_globals.get_output, "pmix:client get completed"); @@ -189,8 +133,15 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t pmix_value_cbfunc_t cbfunc, void *cbdata) { pmix_cb_t *cb; - int rank; - char *nm; + pmix_status_t rc; + size_t n, nfo; + bool wantinfo = false; + bool haveid = false; + pmix_proc_t p; + pmix_info_t *iptr; + bool copy = false; + uint32_t appnum; + pmix_value_t *ival = NULL; PMIX_ACQUIRE_THREAD(&pmix_global_lock); @@ -228,31 +179,181 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t /* if the given proc param is NULL, or the nspace is * empty, then the caller is referencing our own nspace */ if (NULL == proc || 0 == strlen(proc->nspace)) { - nm = pmix_globals.myid.nspace; + PMIX_LOAD_NSPACE(p.nspace, pmix_globals.myid.nspace); } else { - nm = (char*)proc->nspace; + PMIX_LOAD_NSPACE(p.nspace, proc->nspace); } /* if the proc param is NULL, then we are seeking a key that * must be globally unique, so communicate this to the hash * functions with the UNDEF rank */ if (NULL == proc) { - rank = PMIX_RANK_UNDEF; + p.rank = PMIX_RANK_UNDEF; } else { - rank = proc->rank; + p.rank = proc->rank; } + iptr = (pmix_info_t*)info; + nfo = ninfo; pmix_output_verbose(2, pmix_client_globals.get_output, - "pmix: get_nb value for proc %s:%u key %s", - nm, rank, (NULL == key) ? "NULL" : key); + "pmix: get_nb value for proc %s key %s", + PMIX_NAME_PRINT(&p), (NULL == key) ? "NULL" : key); + if (!PMIX_PEER_IS_EARLIER(pmix_client_globals.myserver, 3, 1, 5)) { + /* ]don't consider the fastpath option + * for undefined rank or NULL keys */ + if (PMIX_RANK_UNDEF == p.rank || NULL == key) { + goto doget; + } + /* if they are asking about a node-level piece of info, + * then the rank must be UNDEF */ + if (pmix_check_node_info(key)) { + p.rank = PMIX_RANK_UNDEF; + /* the key is node-related - see if the target node is in the + * info array and if they tagged the request accordingly */ + if (NULL != info) { + for (n=0; n < ninfo; n++) { + if (PMIX_CHECK_KEY(&info[n], PMIX_NODE_INFO)) { + wantinfo = true; + } else if (PMIX_CHECK_KEY(&info[n], PMIX_HOSTNAME)) { + haveid = true; + } else if (PMIX_CHECK_KEY(&info[n], PMIX_NODEID)) { + haveid = true; + } + } + } + if (wantinfo && haveid) { + goto doget; + } else if (wantinfo) { + /* missing the nodeid/hostname - add our hostname */ + nfo = ninfo + 1; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_HOSTNAME, pmix_globals.hostname, PMIX_STRING); + copy = true; + goto doget; + } else if (haveid) { + /* flag that we want node info */ + nfo = ninfo + 1; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL); + copy = true; + goto doget; + } else { + /* missing both */ + nfo = ninfo + 2; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL); + PMIX_INFO_LOAD(&iptr[ninfo+1], PMIX_HOSTNAME, pmix_globals.hostname, PMIX_STRING); + copy = true; + goto doget; + } + } + + /* see if they are asking about an app-level piece of info */ + wantinfo = false; + haveid = false; + if (pmix_check_app_info(key)) { + p.rank = PMIX_RANK_UNDEF; + /* the key is app-related - see if the target appnum is in the + * info array and if they tagged the request accordingly */ + if (NULL != info) { + for (n=0; n < ninfo; n++) { + if (PMIX_CHECK_KEY(&info[n], PMIX_APP_INFO)) { + wantinfo = true; + } else if (PMIX_CHECK_KEY(&info[n], PMIX_APPNUM) && + 0 != info[n].value.data.uint32) { + haveid = true; + } + } + } + if (wantinfo && haveid) { + goto doget; + } else if (wantinfo) { + /* missing the appnum - add ours */ + nfo = ninfo + 1; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + /* try to retrieve it */ + rc = _getfn_fastpath(&pmix_globals.myid, PMIX_APPNUM, NULL, 0, &ival); + if (PMIX_SUCCESS != rc) { + appnum = ival->data.uint32; + PMIX_VALUE_RELEASE(ival); + } else { + appnum = 0; + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APPNUM, &appnum, PMIX_UINT32); + copy = true; + goto doget; + } else if (haveid) { + /* flag that we want app info */ + nfo = ninfo + 1; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APP_INFO, NULL, PMIX_BOOL); + copy = true; + goto doget; + } else { + /* missing both */ + nfo = ninfo + 2; + PMIX_INFO_CREATE(iptr, nfo); + for (n=0; n < ninfo; n++) { + PMIX_INFO_XFER(&iptr[n], &info[n]); + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APP_INFO, NULL, PMIX_BOOL); + /* try to retrieve it */ + rc = _getfn_fastpath(&pmix_globals.myid, PMIX_APPNUM, NULL, 0, &ival); + if (PMIX_SUCCESS != rc) { + appnum = ival->data.uint32; + PMIX_VALUE_RELEASE(ival); + } else { + appnum = 0; + } + PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APPNUM, &appnum, PMIX_UINT32); + copy = true; + goto doget; + } + } + + /* see if they are requesting session info or requesting cache refresh */ + for (n=0; n < ninfo; n++) { + if (PMIX_CHECK_KEY(info, PMIX_SESSION_INFO)) { + goto doget; + } + } + } + + /* try to get data directly, without threadshift */ + if (PMIX_SUCCESS == (rc = _getfn_fastpath(&p, key, iptr, nfo, &ival))) { + if (NULL != cbfunc) { + cbfunc(rc, ival, cbdata); + /* ownership of the memory in ival is passed to the + * user in the cbfunc, so don't release it here */ + } + return rc; + } + + doget: /* threadshift this request so we can access global structures */ cb = PMIX_NEW(pmix_cb_t); - cb->pname.nspace = strdup(nm); - cb->pname.rank = rank; + cb->pname.nspace = strdup(p.nspace); + cb->pname.rank = p.rank; cb->key = (char*)key; - cb->info = (pmix_info_t*)info; - cb->ninfo = ninfo; + cb->info = iptr; + cb->ninfo = nfo; + cb->infocopy = copy; cb->cbfunc.valuefn = cbfunc; cb->cbdata = cbdata; PMIX_THREADSHIFT(cb, _getnbfn); @@ -469,7 +570,7 @@ static pmix_status_t process_values(pmix_value_t **v, pmix_cb_t *cb) } /* we will return the data as an array of pmix_info_t * in the kvs pmix_value_t */ - val = (pmix_value_t*)malloc(sizeof(pmix_value_t)); + PMIX_VALUE_CREATE(val, 1); if (NULL == val) { return PMIX_ERR_NOMEM; } diff --git a/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.c b/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.c index ee8f83f146..3fce1389eb 100644 --- a/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.c +++ b/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.c @@ -307,6 +307,7 @@ static void cbcon(pmix_cb_t *p) p->nprocs = 0; p->info = NULL; p->ninfo = 0; + p->infocopy = false; p->nvals = 0; PMIX_CONSTRUCT(&p->kvs, pmix_list_t); p->copy = false; @@ -321,6 +322,9 @@ static void cbdes(pmix_cb_t *p) free(p->pname.nspace); } PMIX_DESTRUCT(&p->data); + if (p->infocopy) { + PMIX_INFO_FREE(p->info, p->ninfo); + } PMIX_LIST_DESTRUCT(&p->kvs); } PMIX_EXPORT PMIX_CLASS_INSTANCE(pmix_cb_t, diff --git a/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.h b/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.h index 8da9c9ccd2..9cbcd4a607 100644 --- a/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.h +++ b/opal/mca/pmix/pmix3x/pmix/src/include/pmix_globals.h @@ -11,6 +11,10 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2014-2020 Intel, Inc. All rights reserved. + * Copyright (c) 2019 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * Copyright (c) 2019 Mellanox Technologies, Inc. + * All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -391,6 +395,7 @@ typedef struct { size_t nprocs; pmix_info_t *info; size_t ninfo; + bool infocopy; size_t nvals; pmix_list_t kvs; bool copy; diff --git a/opal/mca/pmix/pmix3x/pmix/src/tool/pmix_tool.c b/opal/mca/pmix/pmix3x/pmix/src/tool/pmix_tool.c index 956b16113a..eee9793514 100644 --- a/opal/mca/pmix/pmix3x/pmix/src/tool/pmix_tool.c +++ b/opal/mca/pmix/pmix3x/pmix/src/tool/pmix_tool.c @@ -1,6 +1,6 @@ /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* - * Copyright (c) 2014-2019 Intel, Inc. All rights reserved. + * Copyright (c) 2014-2020 Intel, Inc. All rights reserved. * Copyright (c) 2014-2016 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2014 Artem Y. Polyakov . @@ -249,13 +249,8 @@ static void tool_iof_handler(struct pmix_peer_t *pr, goto cleanup; } /* lookup the handler for this IOF package */ - if (NULL == (req = (pmix_iof_req_t*)pmix_pointer_array_get_item(&pmix_globals.iof_requests, refid))) { - /* something wrong here - should not happen */ - PMIX_ERROR_LOG(PMIX_ERR_NOT_FOUND); - goto cleanup; - } - /* if the handler invokes a callback function, do so */ - if (NULL != req->cbfunc) { + if (NULL != (req = (pmix_iof_req_t*)pmix_pointer_array_get_item(&pmix_globals.iof_requests, refid)) && + NULL != req->cbfunc) { req->cbfunc(refid, channel, &source, &bo, info, ninfo); } else { /* otherwise, simply write it out to the specified std IO channel */