[mpich] MPICH primary repository branch, master, updated. v3.2a2-112-g4be5421
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "MPICH primary repository". The branch, master has been updated via 4be54219b7cb132bc2de3b0c1323211fe1718fb1 (commit) from a30a4721a2d6d8e35b0f33069689d3f0b527c745 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.mpich.org/mpich.git/commitdiff/4be54219b7cb132bc2de3b0c1323211fe1... commit 4be54219b7cb132bc2de3b0c1323211fe1718fb1 Author: Wesley Bland <[email protected]> Date: Thu Jan 15 14:27:42 2015 -0600 Refactor MPI_Testall to have an MPIR version For some reason, there was no MPIR_Testall_impl as there is with many of the other MPI_* functions. This causes a linking problem when weak symbols are disabled and another MPI function needs to call MPI_*. This patch moves most of the MPI_Testall code into MPIR_Testall_impl and has MPI_Waitall call that function instead of MPI_Testall. Signed-off-by: Ken Raffenetti <[email protected]> diff --git a/src/include/mpiimpl.h b/src/include/mpiimpl.h index c26ca52..e178615 100644 --- a/src/include/mpiimpl.h +++ b/src/include/mpiimpl.h @@ -4517,6 +4517,8 @@ void MPIR_Type_lb_impl(MPI_Datatype datatype, MPI_Aint *displacement); int MPIR_Ibsend_impl(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPID_Comm *comm_ptr, MPI_Request *request); int MPIR_Test_impl(MPI_Request *request, int *flag, MPI_Status *status); +int MPIR_Testall_impl(int count, MPI_Request array_of_requests[], int *flag, + MPI_Status array_of_statuses[]); int MPIR_Wait_impl(MPI_Request *request, MPI_Status *status); int MPIR_Waitall_impl(int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]); diff --git a/src/mpi/pt2pt/testall.c b/src/mpi/pt2pt/testall.c index 50107d4..dccc138 100644 --- a/src/mpi/pt2pt/testall.c +++ b/src/mpi/pt2pt/testall.c @@ -30,11 +30,164 @@ int MPI_Testall(int count, MPI_Request array_of_requests[], int *flag, #undef MPI_Testall #define MPI_Testall PMPI_Testall + +#undef FUNCNAME +#define FUNCNAME MPIR_Testall_impl +#undef FCNAME +#define FCNAME MPIU_QUOTE(FUNCNAME) +int MPIR_Testall_impl(int count, MPI_Request array_of_requests[], int *flag, + MPI_Status array_of_statuses[]) +{ + MPID_Request * request_ptr_array[MPID_REQUEST_PTR_ARRAY_SIZE]; + MPID_Request ** request_ptrs = request_ptr_array; + MPI_Status * status_ptr; + int i; + int n_completed; + int active_flag; + int rc; + int proc_failure = FALSE; + int mpi_errno = MPI_SUCCESS; + MPIU_CHKLMEM_DECL(1); + + /* Convert MPI request handles to a request object pointers */ + if (count > MPID_REQUEST_PTR_ARRAY_SIZE) + { + MPIU_CHKLMEM_MALLOC_ORJUMP(request_ptrs, MPID_Request **, + count * sizeof(MPID_Request *), mpi_errno, "request pointers"); + } + + n_completed = 0; + for (i = 0; i < count; i++) + { + if (array_of_requests[i] != MPI_REQUEST_NULL) + { + MPID_Request_get_ptr(array_of_requests[i], request_ptrs[i]); + /* Validate object pointers if error checking is enabled */ +# ifdef HAVE_ERROR_CHECKING + { + MPID_BEGIN_ERROR_CHECKS; + { + MPID_Request_valid_ptr( request_ptrs[i], mpi_errno ); + if (mpi_errno) goto fn_fail; + } + MPID_END_ERROR_CHECKS; + } +# endif + } + else + { + request_ptrs[i] = NULL; + n_completed += 1; + } + } + + mpi_errno = MPID_Progress_test(); + if (mpi_errno != MPI_SUCCESS) goto fn_fail; + + for (i = 0; i < count; i++) + { + if (request_ptrs[i] != NULL && + request_ptrs[i]->kind == MPID_UREQUEST && + request_ptrs[i]->greq_fns->poll_fn != NULL) + { + mpi_errno = (request_ptrs[i]->greq_fns->poll_fn)(request_ptrs[i]->greq_fns->grequest_extra_state, + &(array_of_statuses[i])); + if (mpi_errno != MPI_SUCCESS) goto fn_fail; + } + if (request_ptrs[i] != NULL) + { + if (MPID_Request_is_complete(request_ptrs[i])) + { + n_completed++; + rc = MPIR_Request_get_error(request_ptrs[i]); + if (rc != MPI_SUCCESS) + { + if (MPIX_ERR_PROC_FAILED == MPIR_ERR_GET_CLASS(rc) || MPIX_ERR_PROC_FAILED_PENDING == MPIR_ERR_GET_CLASS(rc)) + proc_failure = TRUE; + mpi_errno = MPI_ERR_IN_STATUS; + } + } else if (unlikely(MPIR_CVAR_ENABLE_FT && + MPID_Request_is_anysource(request_ptrs[i]) && + !MPID_Comm_AS_enabled(request_ptrs[i]->comm))) + { + mpi_errno = MPI_ERR_IN_STATUS; + MPIU_ERR_SET(rc, MPIX_ERR_PROC_FAILED_PENDING, "**failure_pending"); + status_ptr = (array_of_statuses != MPI_STATUSES_IGNORE) ? &array_of_statuses[i] : MPI_STATUS_IGNORE; + if (status_ptr != MPI_STATUS_IGNORE) status_ptr->MPI_ERROR = rc; + proc_failure = TRUE; + } + } + } + + if (n_completed == count || mpi_errno == MPI_ERR_IN_STATUS) + { + n_completed = 0; + for (i = 0; i < count; i++) + { + if (request_ptrs[i] != NULL) + { + if (MPID_Request_is_complete(request_ptrs[i])) + { + n_completed ++; + status_ptr = (array_of_statuses != MPI_STATUSES_IGNORE) ? &array_of_statuses[i] : MPI_STATUS_IGNORE; + rc = MPIR_Request_complete(&array_of_requests[i], request_ptrs[i], status_ptr, &active_flag); + if (mpi_errno == MPI_ERR_IN_STATUS && status_ptr != MPI_STATUS_IGNORE) + { + if (active_flag) + { + status_ptr->MPI_ERROR = rc; + } + else + { + status_ptr->MPI_ERROR = MPI_SUCCESS; + } + } + } + else + { + if (mpi_errno == MPI_ERR_IN_STATUS && array_of_statuses != MPI_STATUSES_IGNORE) + { + if (!proc_failure) + array_of_statuses[i].MPI_ERROR = MPI_ERR_PENDING; + else + array_of_statuses[i].MPI_ERROR = MPIX_ERR_PROC_FAILED_PENDING; + } + } + } + else + { + n_completed ++; + if (array_of_statuses != MPI_STATUSES_IGNORE) + { + MPIR_Status_set_empty(&array_of_statuses[i]); + if (mpi_errno == MPI_ERR_IN_STATUS) + { + array_of_statuses[i].MPI_ERROR = MPI_SUCCESS; + } + } + } + } + } + + *flag = (n_completed == count) ? TRUE : FALSE; + + fn_exit: + if (count > MPID_REQUEST_PTR_ARRAY_SIZE) + { + MPIU_CHKLMEM_FREEALL(); + } + + return mpi_errno; + fn_fail: + goto fn_exit; +} + #endif #undef FUNCNAME #define FUNCNAME MPI_Testall - +#undef FCNAME +#define FCNAME MPIU_QUOTE(FUNCNAME) /*@ MPI_Testall - Tests for the completion of all previously initiated requests @@ -79,17 +232,8 @@ program to unexecpectedly terminate or produce incorrect results. int MPI_Testall(int count, MPI_Request array_of_requests[], int *flag, MPI_Status array_of_statuses[]) { - static const char FCNAME[] = "MPI_Testall"; - MPID_Request * request_ptr_array[MPID_REQUEST_PTR_ARRAY_SIZE]; - MPID_Request ** request_ptrs = request_ptr_array; - MPI_Status * status_ptr; - int i; - int n_completed; - int active_flag; - int rc; - int proc_failure = FALSE; int mpi_errno = MPI_SUCCESS; - MPIU_CHKLMEM_DECL(1); + int i; MPID_MPI_STATE_DECL(MPID_STATE_MPI_TESTALL); MPIR_ERRTEST_INITIALIZED_ORDIE(); @@ -120,138 +264,13 @@ int MPI_Testall(int count, MPI_Request array_of_requests[], int *flag, # endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ - - /* Convert MPI request handles to a request object pointers */ - if (count > MPID_REQUEST_PTR_ARRAY_SIZE) - { - MPIU_CHKLMEM_MALLOC_ORJUMP(request_ptrs, MPID_Request **, - count * sizeof(MPID_Request *), mpi_errno, "request pointers"); - } - - n_completed = 0; - for (i = 0; i < count; i++) - { - if (array_of_requests[i] != MPI_REQUEST_NULL) - { - MPID_Request_get_ptr(array_of_requests[i], request_ptrs[i]); - /* Validate object pointers if error checking is enabled */ -# ifdef HAVE_ERROR_CHECKING - { - MPID_BEGIN_ERROR_CHECKS; - { - MPID_Request_valid_ptr( request_ptrs[i], mpi_errno ); - if (mpi_errno) goto fn_fail; - } - MPID_END_ERROR_CHECKS; - } -# endif - } - else - { - request_ptrs[i] = NULL; - n_completed += 1; - } - } - - mpi_errno = MPID_Progress_test(); - if (mpi_errno != MPI_SUCCESS) goto fn_fail; - - for (i = 0; i < count; i++) - { - if (request_ptrs[i] != NULL && - request_ptrs[i]->kind == MPID_UREQUEST && - request_ptrs[i]->greq_fns->poll_fn != NULL) - { - mpi_errno = (request_ptrs[i]->greq_fns->poll_fn)(request_ptrs[i]->greq_fns->grequest_extra_state, - &(array_of_statuses[i])); - if (mpi_errno != MPI_SUCCESS) goto fn_fail; - } - if (request_ptrs[i] != NULL) - { - if (MPID_Request_is_complete(request_ptrs[i])) - { - n_completed++; - rc = MPIR_Request_get_error(request_ptrs[i]); - if (rc != MPI_SUCCESS) - { - if (MPIX_ERR_PROC_FAILED == MPIR_ERR_GET_CLASS(rc) || MPIX_ERR_PROC_FAILED_PENDING == MPIR_ERR_GET_CLASS(rc)) - proc_failure = TRUE; - mpi_errno = MPI_ERR_IN_STATUS; - } - } else if (unlikely(MPIR_CVAR_ENABLE_FT && - MPID_Request_is_anysource(request_ptrs[i]) && - !MPID_Comm_AS_enabled(request_ptrs[i]->comm))) - { - mpi_errno = MPI_ERR_IN_STATUS; - MPIU_ERR_SET(rc, MPIX_ERR_PROC_FAILED_PENDING, "**failure_pending"); - status_ptr = (array_of_statuses != MPI_STATUSES_IGNORE) ? &array_of_statuses[i] : MPI_STATUS_IGNORE; - if (status_ptr != MPI_STATUS_IGNORE) status_ptr->MPI_ERROR = rc; - proc_failure = TRUE; - } - } - } - - if (n_completed == count || mpi_errno == MPI_ERR_IN_STATUS) - { - n_completed = 0; - for (i = 0; i < count; i++) - { - if (request_ptrs[i] != NULL) - { - if (MPID_Request_is_complete(request_ptrs[i])) - { - n_completed ++; - status_ptr = (array_of_statuses != MPI_STATUSES_IGNORE) ? &array_of_statuses[i] : MPI_STATUS_IGNORE; - rc = MPIR_Request_complete(&array_of_requests[i], request_ptrs[i], status_ptr, &active_flag); - if (mpi_errno == MPI_ERR_IN_STATUS && status_ptr != MPI_STATUS_IGNORE) - { - if (active_flag) - { - status_ptr->MPI_ERROR = rc; - } - else - { - status_ptr->MPI_ERROR = MPI_SUCCESS; - } - } - } - else - { - if (mpi_errno == MPI_ERR_IN_STATUS && array_of_statuses != MPI_STATUSES_IGNORE) - { - if (!proc_failure) - array_of_statuses[i].MPI_ERROR = MPI_ERR_PENDING; - else - array_of_statuses[i].MPI_ERROR = MPIX_ERR_PROC_FAILED_PENDING; - } - } - } - else - { - n_completed ++; - if (array_of_statuses != MPI_STATUSES_IGNORE) - { - MPIR_Status_set_empty(&array_of_statuses[i]); - if (mpi_errno == MPI_ERR_IN_STATUS) - { - array_of_statuses[i].MPI_ERROR = MPI_SUCCESS; - } - } - } - } - } - - *flag = (n_completed == count) ? TRUE : FALSE; + mpi_errno = MPIR_Testall_impl(count, array_of_requests, flag, array_of_statuses); if (mpi_errno != MPI_SUCCESS) goto fn_fail; /* ... end of body of routine ... */ fn_exit: - if (count > MPID_REQUEST_PTR_ARRAY_SIZE) - { - MPIU_CHKLMEM_FREEALL(); - } MPID_MPI_PT2PT_FUNC_EXIT(MPID_STATE_MPI_TESTALL); MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/src/mpi/pt2pt/waitall.c b/src/mpi/pt2pt/waitall.c index eda6eaf..98cc267 100644 --- a/src/mpi/pt2pt/waitall.c +++ b/src/mpi/pt2pt/waitall.c @@ -114,7 +114,7 @@ int MPIR_Waitall_impl(int count, MPI_Request array_of_requests[], } if (unlikely(disabled_anysource)) { - mpi_errno = MPI_Testall(count, array_of_requests, &disabled_anysource, array_of_statuses); + mpi_errno = MPIR_Testall_impl(count, array_of_requests, &disabled_anysource, array_of_statuses); goto fn_exit; } ----------------------------------------------------------------------- Summary of changes: src/include/mpiimpl.h | 2 + src/mpi/pt2pt/testall.c | 293 +++++++++++++++++++++++++---------------------- src/mpi/pt2pt/waitall.c | 2 +- 3 files changed, 159 insertions(+), 138 deletions(-) hooks/post-receive -- MPICH primary repository
participants (1)
-
noreply@mpich.org