Fix for buglet #1423.
Any non-blocking P2P function should set the request to something else then MPI_REQUEST_NULL, when passed a source/dest of MPI_PROC_NULL. Introduce a new ompi_request_empty, which returns the MPI_SOURCE=MPI_PROC_NULL, MPI_TAG=MPI_ANY_TAG, count=0 as specified by the MPI-standard. This commit was SVN r6611.
Этот коммит содержится в:
родитель
c95bb59651
Коммит
15c4ae3391
@ -37,7 +37,7 @@ int MPI_Bsend_init(void *buf, int count, MPI_Datatype type,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ int MPI_Ibsend(void *buf, int count, MPI_Datatype type, int dest,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype type, int source,
|
||||
{
|
||||
int rc;
|
||||
if (source == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ int MPI_Irsend(void *buf, int count, MPI_Datatype type, int dest,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ int MPI_Isend(void *buf, int count, MPI_Datatype type, int dest,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ int MPI_Issend(void *buf, int count, MPI_Datatype type, int dest,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ int MPI_Recv_init(void *buf, int count, MPI_Datatype type, int source,
|
||||
{
|
||||
int rc;
|
||||
if (source == MPI_PROC_NULL) {
|
||||
*request = &ompi_request_null;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ int MPI_Rsend_init(void *buf, int count, MPI_Datatype type,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ int MPI_Send_init(void *buf, int count, MPI_Datatype type,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ int MPI_Ssend_init(void *buf, int count, MPI_Datatype type,
|
||||
{
|
||||
int rc;
|
||||
if (dest == MPI_PROC_NULL) {
|
||||
*request = MPI_REQUEST_NULL;
|
||||
*request = &ompi_request_empty;
|
||||
return MPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@ int ompi_request_poll_iterations = 20000;
|
||||
OMPI_DECLSPEC opal_mutex_t ompi_request_lock;
|
||||
OMPI_DECLSPEC opal_condition_t ompi_request_cond;
|
||||
OMPI_DECLSPEC ompi_request_t ompi_request_null;
|
||||
OMPI_DECLSPEC ompi_request_t ompi_request_empty;
|
||||
ompi_status_public_t ompi_status_empty;
|
||||
|
||||
|
||||
@ -67,6 +68,7 @@ int ompi_request_init(void)
|
||||
OBJ_CONSTRUCT(&ompi_request_lock, opal_mutex_t);
|
||||
OBJ_CONSTRUCT(&ompi_request_cond, opal_condition_t);
|
||||
OBJ_CONSTRUCT(&ompi_request_null, ompi_request_t);
|
||||
OBJ_CONSTRUCT(&ompi_request_empty, ompi_request_t);
|
||||
|
||||
ompi_request_null.req_status.MPI_SOURCE = MPI_PROC_NULL;
|
||||
ompi_request_null.req_status.MPI_TAG = MPI_ANY_TAG;
|
||||
@ -87,6 +89,33 @@ int ompi_request_init(void)
|
||||
return OMPI_ERR_REQUEST;
|
||||
}
|
||||
|
||||
/* We need a way to distinguish between the user provided
|
||||
* MPI_REQUEST_NULL to MPI_Wait* and a non-active (MPI_PROC_NULL)
|
||||
* request passed to any P2P non-blocking function.
|
||||
*
|
||||
* The main difference to ompi_request_null is
|
||||
* req_state being OMPI_REQUEST_ACTIVE, so that MPI_Waitall
|
||||
* does not set the status to ompi_status_empty.
|
||||
*/
|
||||
ompi_request_empty.req_status.MPI_SOURCE = MPI_PROC_NULL;
|
||||
ompi_request_empty.req_status.MPI_TAG = MPI_ANY_TAG;
|
||||
ompi_request_empty.req_status.MPI_ERROR = MPI_SUCCESS;
|
||||
ompi_request_empty.req_status._count = 0;
|
||||
ompi_request_empty.req_status._cancelled = 0;
|
||||
|
||||
ompi_request_empty.req_state = OMPI_REQUEST_ACTIVE;
|
||||
ompi_request_empty.req_complete = true;
|
||||
ompi_request_empty.req_type = OMPI_REQUEST_NULL;
|
||||
ompi_request_empty.req_fini = ompi_request_null_free;
|
||||
ompi_request_empty.req_free = ompi_request_null_free;
|
||||
ompi_request_empty.req_cancel = ompi_request_null_cancel;
|
||||
ompi_request_empty.req_f_to_c_index =
|
||||
ompi_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_empty);
|
||||
|
||||
if (1 != ompi_request_empty.req_f_to_c_index) {
|
||||
return OMPI_ERR_REQUEST;
|
||||
}
|
||||
|
||||
ompi_status_empty.MPI_SOURCE = MPI_ANY_SOURCE;
|
||||
ompi_status_empty.MPI_TAG = MPI_ANY_TAG;
|
||||
ompi_status_empty.MPI_ERROR = MPI_SUCCESS;
|
||||
|
@ -142,6 +142,7 @@ OMPI_DECLSPEC extern opal_mutex_t ompi_request_lock;
|
||||
OMPI_DECLSPEC extern opal_condition_t ompi_request_cond;
|
||||
OMPI_DECLSPEC extern int ompi_request_poll_iterations;
|
||||
OMPI_DECLSPEC extern ompi_request_t ompi_request_null;
|
||||
OMPI_DECLSPEC extern ompi_request_t ompi_request_empty;
|
||||
OMPI_DECLSPEC extern ompi_status_public_t ompi_status_empty;
|
||||
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user