Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion ompi/mca/coll/base/coll_base_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
* Copyright (c) 2023 Jeffrey M. Squyres. All rights reserved.
*
* Copyright (c) 2024 NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
*
* $COPYRIGHT$
*
Expand Down Expand Up @@ -134,7 +136,7 @@ int ompi_rounddown(int num, int factor)
/**
* Release all objects and arrays stored into the nbc_request.
* The release_arrays are temporary memory to stored the values
* converted from Fortran, and should disappear in same time as the
* converted from Fortran or elsewhere, and should disappear in same time as the
* request itself.
*/
static void
Expand Down Expand Up @@ -268,6 +270,7 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request)
}
request->data.refcounted.vecs.rtypes = NULL;
}
release_objs_callback(request);
}

static int complete_vecs_callback(struct ompi_request_t *req) {
Expand Down Expand Up @@ -346,6 +349,24 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
return OMPI_SUCCESS;
}

int ompi_coll_base_add_release_arrays_cb(ompi_request_t *req)
{
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;

assert(NULL != request);

if (req->req_persistent && (NULL == req->req_free)) {
request->cb.req_free = req->req_free;
req->req_free = free_objs_callback;
} else if (NULL == req->req_complete_cb) {
request->cb.req_complete_cb = req->req_complete_cb;
request->req_complete_cb_data = req->req_complete_cb_data;
req->req_complete_cb = complete_objs_callback;
req->req_complete_cb_data = request;
}
return OMPI_SUCCESS;
}

static void nbc_req_constructor(ompi_coll_base_nbc_request_t *req)
{
req->cb.req_complete_cb = NULL;
Expand Down
46 changes: 46 additions & 0 deletions ompi/mca/coll/base/coll_base_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2014-2020 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2024 NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -95,6 +97,43 @@ ompi_coll_base_nbc_reserve_tags(ompi_communicator_t* comm, int32_t reserve)
return tag;
}

/**
* Append an array to a request object to be freed upon completion
* of the associated operation.
* The request object must be of type ompi_coll_base_nbc_request_t.
*/
__opal_attribute_always_inline__ static inline int
ompi_coll_base_append_array_to_release(struct ompi_request_t *req, void *array_ptr)
{
int i, ret = OMPI_SUCCESS;
struct ompi_coll_base_nbc_request_t *request = (struct ompi_coll_base_nbc_request_t *)req;

/*
* important sanity check - doing steps below on a non-libnbc request can lead
* to difficult to debug memory corruption problems
*/
assert(request->super.req_type == OMPI_REQUEST_COLL);

for(i = 0; i < OMPI_REQ_NB_RELEASE_ARRAYS; i++ ) {
if (NULL == request->data.release_arrays[i]) {
break;
}
}

if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
request->data.release_arrays[i] = array_ptr;
++i;
if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
request->data.release_arrays[i] = NULL;
}
} else {
ret = OMPI_ERR_OUT_OF_RESOURCE;
}

assert(OMPI_SUCCESS == ret);
return ret;
}

typedef struct ompi_coll_base_nbc_request_t ompi_coll_base_nbc_request_t;

/*
Expand Down Expand Up @@ -188,6 +227,13 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *request,
ompi_datatype_t * const rtypes[],
bool use_topo);

/**
* If necessary, set callback to free extra memory regions
* set in release_arrays. Not set if a callback is already
* associated with the request.
*/
int ompi_coll_base_add_release_arrays_cb(ompi_request_t *request);

/* File reading function */
int ompi_coll_base_file_getnext_long(FILE *fptr, int *fileline, long* val);
int ompi_coll_base_file_getnext_size_t(FILE *fptr, int *fileline, size_t* val);
Expand Down
13 changes: 7 additions & 6 deletions ompi/mpi/fortran/mpif-h/allgatherv_init_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2021 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -77,7 +79,7 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
MPI_Datatype c_sendtype, c_recvtype;
MPI_Request c_request;
MPI_Info c_info;
int size, idx = 0, ierr_c;
int size, ierr_c;
OMPI_ARRAY_NAME_DECL(recvcounts);
OMPI_ARRAY_NAME_DECL(displs);

Expand Down Expand Up @@ -105,12 +107,11 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(ierr_c);
if (MPI_SUCCESS == ierr_c) {
*request = PMPI_Request_c2f(c_request);
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
ompi_coll_base_add_release_arrays_cb(c_request);
}
nb_request->data.release_arrays[idx] = NULL;
} else {
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
Expand Down
17 changes: 9 additions & 8 deletions ompi/mpi/fortran/mpif-h/alltoallv_init_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2021 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -77,7 +79,7 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
MPI_Datatype c_sendtype, c_recvtype;
MPI_Info c_info;
MPI_Request c_request;
int size, idx = 0, c_ierr;
int size, c_ierr;
OMPI_ARRAY_NAME_DECL(sendcounts);
OMPI_ARRAY_NAME_DECL(sdispls);
OMPI_ARRAY_NAME_DECL(recvcounts);
Expand Down Expand Up @@ -109,14 +111,13 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
if (MPI_SUCCESS == c_ierr) {
*request = PMPI_Request_c2f(c_request);
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
ompi_coll_base_add_release_arrays_cb(c_request);
}
nb_request->data.release_arrays[idx] = NULL;
} else {
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);
Expand Down
23 changes: 12 additions & 11 deletions ompi/mpi/fortran/mpif-h/alltoallw_init_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2021 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -78,7 +80,7 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
MPI_Info c_info;
MPI_Request c_request;
int size, idx = 0, c_ierr;
int size, c_ierr;
OMPI_ARRAY_NAME_DECL(sendcounts);
OMPI_ARRAY_NAME_DECL(sdispls);
OMPI_ARRAY_NAME_DECL(recvcounts);
Expand Down Expand Up @@ -119,20 +121,19 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
if (MPI_SUCCESS == c_ierr) {
*request = PMPI_Request_c2f(c_request);
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
nb_request->data.release_arrays[idx++] = c_recvtypes;
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
}
if (NULL != c_sendtypes) {
nb_request->data.release_arrays[idx++] = c_sendtypes;
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
ompi_coll_base_append_array_to_release(c_request, c_sendtypes);
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
}
}
nb_request->data.release_arrays[idx] = NULL;
ompi_coll_base_add_release_arrays_cb(c_request);
} else {
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);
Expand Down
13 changes: 7 additions & 6 deletions ompi/mpi/fortran/mpif-h/gatherv_init_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2021 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -77,7 +79,7 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
MPI_Datatype c_sendtype, c_recvtype;
MPI_Info c_info;
MPI_Request c_request;
int size, idx = 0, c_ierr;
int size, c_ierr;
OMPI_ARRAY_NAME_DECL(recvcounts);
OMPI_ARRAY_NAME_DECL(displs);

Expand All @@ -104,12 +106,11 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
if (MPI_SUCCESS == c_ierr) {
*request = PMPI_Request_c2f(c_request);
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
ompi_coll_base_add_release_arrays_cb(c_request);
}
nb_request->data.release_arrays[idx] = NULL;
} else {
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
Expand Down
13 changes: 7 additions & 6 deletions ompi/mpi/fortran/mpif-h/iallgatherv_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -76,7 +78,7 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
MPI_Comm c_comm;
MPI_Datatype c_sendtype, c_recvtype;
MPI_Request c_request;
int size, idx = 0, ierr_c;
int size, ierr_c;
OMPI_ARRAY_NAME_DECL(recvcounts);
OMPI_ARRAY_NAME_DECL(displs);

Expand Down Expand Up @@ -107,11 +109,10 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
} else {
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
ompi_coll_base_add_release_arrays_cb(c_request);
}
nb_request->data.release_arrays[idx] = NULL;
}
}
17 changes: 9 additions & 8 deletions ompi/mpi/fortran/mpif-h/ialltoallv_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -76,7 +78,7 @@ void ompi_ialltoallv_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispls,
MPI_Comm c_comm;
MPI_Datatype c_sendtype, c_recvtype;
MPI_Request c_request;
int size, idx = 0, c_ierr;
int size, c_ierr;
OMPI_ARRAY_NAME_DECL(sendcounts);
OMPI_ARRAY_NAME_DECL(sdispls);
OMPI_ARRAY_NAME_DECL(recvcounts);
Expand Down Expand Up @@ -113,13 +115,12 @@ void ompi_ialltoallv_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispls,
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
} else {
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
ompi_coll_base_add_release_arrays_cb(c_request);
}
nb_request->data.release_arrays[idx] = NULL;
}
}
23 changes: 12 additions & 11 deletions ompi/mpi/fortran/mpif-h/ialltoallw_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2025 Triad National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -78,7 +80,7 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
MPI_Comm c_comm;
MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
MPI_Request c_request;
int size, idx = 0, c_ierr;
int size, c_ierr;
OMPI_ARRAY_NAME_DECL(sendcounts);
OMPI_ARRAY_NAME_DECL(sdispls);
OMPI_ARRAY_NAME_DECL(recvcounts);
Expand Down Expand Up @@ -128,17 +130,16 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
} else {
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
}
if (sdispls != OMPI_ARRAY_NAME_CONVERT(sdispls)) {
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
if ((void *)sdispls != (void *)OMPI_ARRAY_NAME_CONVERT(sdispls)) {
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
}
nb_request->data.release_arrays[idx++] = c_recvtypes;
nb_request->data.release_arrays[idx++] = c_sendtypes;
nb_request->data.release_arrays[idx] = NULL;
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
ompi_coll_base_append_array_to_release(c_request, c_sendtypes);
ompi_coll_base_add_release_arrays_cb(c_request);
}
}
Loading