1
1

Updating OMPI v4.0.x to PMIx v3.1.5 released

Signed-off-by: Geoffrey Paulsen <gpaulsen@us.ibm.com>
Этот коммит содержится в:
Geoffrey Paulsen 2020-02-24 12:13:20 -05:00
родитель 625f27a715
Коммит 11d79d1f6e
8 изменённых файлов: 216 добавлений и 106 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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<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

Просмотреть файл

@ -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__)],

Просмотреть файл

@ -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

Просмотреть файл

@ -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 <artpol84@gmail.com>.
@ -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;
}

Просмотреть файл

@ -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,

Просмотреть файл

@ -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;

Просмотреть файл

@ -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 <artpol84@gmail.com>.
@ -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 */