Due to MPI_Comm_idup we can no longer use the communicator's CID as
the fortran handle. Use a seperate opal_pointer_array to keep track of the fortran handles of communicators. This commit also fixes a bug in ompi_comm_idup where the newcomm was not set until after the operation completed. cmr=v1.7.4:reviewer=jsquyres:ticket=trac:3796 This commit was SVN r29342. The following Trac tickets were found above: Ticket 3796 --> https://svn.open-mpi.org/trac/ompi/ticket/3796
Этот коммит содержится в:
родитель
2121e9c01b
Коммит
c17b21b11d
@ -1005,6 +1005,9 @@ int ompi_comm_idup_with_info (ompi_communicator_t *comm, ompi_info_t *info, ompi
|
|||||||
|
|
||||||
ompi_comm_request_schedule_append (request, ompi_comm_idup_getcid, &subreq, subreq ? 1 : 0);
|
ompi_comm_request_schedule_append (request, ompi_comm_idup_getcid, &subreq, subreq ? 1 : 0);
|
||||||
|
|
||||||
|
/* assign the newcomm now */
|
||||||
|
*newcomm = context->newcomp;
|
||||||
|
|
||||||
/* kick off the request */
|
/* kick off the request */
|
||||||
ompi_comm_request_start (request);
|
ompi_comm_request_start (request);
|
||||||
*req = &request->super;
|
*req = &request->super;
|
||||||
@ -1071,11 +1074,6 @@ static int ompi_comm_idup_with_info_activate (ompi_comm_request_t *request)
|
|||||||
|
|
||||||
static int ompi_comm_idup_with_info_finish (ompi_comm_request_t *request)
|
static int ompi_comm_idup_with_info_finish (ompi_comm_request_t *request)
|
||||||
{
|
{
|
||||||
struct ompi_comm_idup_with_info_context *context =
|
|
||||||
(struct ompi_comm_idup_with_info_context *) request->context;
|
|
||||||
|
|
||||||
*context->newcomm = context->newcomp;
|
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
return MPI_SUCCESS;
|
return MPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -302,7 +302,6 @@ int ompi_comm_nextcid ( ompi_communicator_t* newcomm,
|
|||||||
|
|
||||||
/* set the according values to the newcomm */
|
/* set the according values to the newcomm */
|
||||||
newcomm->c_contextid = nextcid;
|
newcomm->c_contextid = nextcid;
|
||||||
newcomm->c_f_to_c_index = newcomm->c_contextid;
|
|
||||||
opal_pointer_array_set_item (&ompi_mpi_communicators, nextcid, newcomm);
|
opal_pointer_array_set_item (&ompi_mpi_communicators, nextcid, newcomm);
|
||||||
|
|
||||||
release_and_return:
|
release_and_return:
|
||||||
@ -468,7 +467,6 @@ static int ompi_comm_nextcid_check_flag (ompi_comm_request_t *request)
|
|||||||
if (1 == context->rflag) {
|
if (1 == context->rflag) {
|
||||||
/* set the according values to the newcomm */
|
/* set the according values to the newcomm */
|
||||||
context->newcomm->c_contextid = context->nextcid;
|
context->newcomm->c_contextid = context->nextcid;
|
||||||
context->newcomm->c_f_to_c_index = context->newcomm->c_contextid;
|
|
||||||
opal_pointer_array_set_item (&ompi_mpi_communicators, context->nextcid, context->newcomm);
|
opal_pointer_array_set_item (&ompi_mpi_communicators, context->nextcid, context->newcomm);
|
||||||
|
|
||||||
ompi_comm_unregister_cid (context->comm->c_contextid);
|
ompi_comm_unregister_cid (context->comm->c_contextid);
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
opal_pointer_array_t ompi_mpi_communicators;
|
opal_pointer_array_t ompi_mpi_communicators;
|
||||||
|
opal_pointer_array_t ompi_comm_f_to_c_table;
|
||||||
|
|
||||||
ompi_predefined_communicator_t ompi_mpi_comm_world;
|
ompi_predefined_communicator_t ompi_mpi_comm_world;
|
||||||
ompi_predefined_communicator_t ompi_mpi_comm_self;
|
ompi_predefined_communicator_t ompi_mpi_comm_self;
|
||||||
@ -86,8 +87,16 @@ int ompi_comm_init(void)
|
|||||||
return OMPI_ERROR;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Setup f to c table (we can no longer use the cid as the fortran handle) */
|
||||||
|
OBJ_CONSTRUCT(&ompi_comm_f_to_c_table, opal_pointer_array_t);
|
||||||
|
if( OPAL_SUCCESS != opal_pointer_array_init(&ompi_comm_f_to_c_table, 0,
|
||||||
|
OMPI_FORTRAN_HANDLE_MAX, 64) ) {
|
||||||
|
return OMPI_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup MPI_COMM_WORLD */
|
/* Setup MPI_COMM_WORLD */
|
||||||
OBJ_CONSTRUCT(&ompi_mpi_comm_world, ompi_communicator_t);
|
OBJ_CONSTRUCT(&ompi_mpi_comm_world, ompi_communicator_t);
|
||||||
|
assert(ompi_mpi_comm_world.comm.c_f_to_c_index == 0);
|
||||||
group = OBJ_NEW(ompi_group_t);
|
group = OBJ_NEW(ompi_group_t);
|
||||||
group->grp_proc_pointers = ompi_proc_world(&size);
|
group->grp_proc_pointers = ompi_proc_world(&size);
|
||||||
group->grp_proc_count = (int)size;
|
group->grp_proc_count = (int)size;
|
||||||
@ -99,7 +108,6 @@ int ompi_comm_init(void)
|
|||||||
ompi_mpi_comm_world.comm.c_contextid = 0;
|
ompi_mpi_comm_world.comm.c_contextid = 0;
|
||||||
ompi_mpi_comm_world.comm.c_id_start_index = 4;
|
ompi_mpi_comm_world.comm.c_id_start_index = 4;
|
||||||
ompi_mpi_comm_world.comm.c_id_available = 4;
|
ompi_mpi_comm_world.comm.c_id_available = 4;
|
||||||
ompi_mpi_comm_world.comm.c_f_to_c_index = 0;
|
|
||||||
ompi_mpi_comm_world.comm.c_my_rank = group->grp_my_rank;
|
ompi_mpi_comm_world.comm.c_my_rank = group->grp_my_rank;
|
||||||
ompi_mpi_comm_world.comm.c_local_group = group;
|
ompi_mpi_comm_world.comm.c_local_group = group;
|
||||||
ompi_mpi_comm_world.comm.c_remote_group = group;
|
ompi_mpi_comm_world.comm.c_remote_group = group;
|
||||||
@ -124,15 +132,15 @@ int ompi_comm_init(void)
|
|||||||
|
|
||||||
/* Setup MPI_COMM_SELF */
|
/* Setup MPI_COMM_SELF */
|
||||||
OBJ_CONSTRUCT(&ompi_mpi_comm_self, ompi_communicator_t);
|
OBJ_CONSTRUCT(&ompi_mpi_comm_self, ompi_communicator_t);
|
||||||
|
assert(ompi_mpi_comm_self.comm.c_f_to_c_index == 1);
|
||||||
group = OBJ_NEW(ompi_group_t);
|
group = OBJ_NEW(ompi_group_t);
|
||||||
group->grp_proc_pointers = ompi_proc_self(&size);
|
group->grp_proc_pointers = ompi_proc_self(&size);
|
||||||
group->grp_my_rank = 0;
|
group->grp_my_rank = 0;
|
||||||
group->grp_proc_count = (int)size;
|
group->grp_proc_count = (int)size;
|
||||||
OMPI_GROUP_SET_INTRINSIC (group);
|
OMPI_GROUP_SET_INTRINSIC (group);
|
||||||
OMPI_GROUP_SET_DENSE (group);
|
OMPI_GROUP_SET_DENSE (group);
|
||||||
|
|
||||||
ompi_mpi_comm_self.comm.c_contextid = 1;
|
ompi_mpi_comm_self.comm.c_contextid = 1;
|
||||||
ompi_mpi_comm_self.comm.c_f_to_c_index = 1;
|
|
||||||
ompi_mpi_comm_self.comm.c_id_start_index = 20;
|
ompi_mpi_comm_self.comm.c_id_start_index = 20;
|
||||||
ompi_mpi_comm_self.comm.c_id_available = 20;
|
ompi_mpi_comm_self.comm.c_id_available = 20;
|
||||||
ompi_mpi_comm_self.comm.c_my_rank = group->grp_my_rank;
|
ompi_mpi_comm_self.comm.c_my_rank = group->grp_my_rank;
|
||||||
@ -156,13 +164,13 @@ int ompi_comm_init(void)
|
|||||||
|
|
||||||
/* Setup MPI_COMM_NULL */
|
/* Setup MPI_COMM_NULL */
|
||||||
OBJ_CONSTRUCT(&ompi_mpi_comm_null, ompi_communicator_t);
|
OBJ_CONSTRUCT(&ompi_mpi_comm_null, ompi_communicator_t);
|
||||||
|
assert(ompi_mpi_comm_null.comm.c_f_to_c_index == 2);
|
||||||
ompi_mpi_comm_null.comm.c_local_group = &ompi_mpi_group_null.group;
|
ompi_mpi_comm_null.comm.c_local_group = &ompi_mpi_group_null.group;
|
||||||
ompi_mpi_comm_null.comm.c_remote_group = &ompi_mpi_group_null.group;
|
ompi_mpi_comm_null.comm.c_remote_group = &ompi_mpi_group_null.group;
|
||||||
OBJ_RETAIN(&ompi_mpi_group_null.group);
|
OBJ_RETAIN(&ompi_mpi_group_null.group);
|
||||||
OBJ_RETAIN(&ompi_mpi_group_null.group);
|
OBJ_RETAIN(&ompi_mpi_group_null.group);
|
||||||
|
|
||||||
ompi_mpi_comm_null.comm.c_contextid = 2;
|
ompi_mpi_comm_null.comm.c_contextid = 2;
|
||||||
ompi_mpi_comm_null.comm.c_f_to_c_index = 2;
|
|
||||||
ompi_mpi_comm_null.comm.c_my_rank = MPI_PROC_NULL;
|
ompi_mpi_comm_null.comm.c_my_rank = MPI_PROC_NULL;
|
||||||
|
|
||||||
ompi_mpi_comm_null.comm.error_handler = &ompi_mpi_errors_are_fatal.eh;
|
ompi_mpi_comm_null.comm.error_handler = &ompi_mpi_errors_are_fatal.eh;
|
||||||
@ -184,6 +192,9 @@ int ompi_comm_init(void)
|
|||||||
allocation */
|
allocation */
|
||||||
ompi_comm_reg_init();
|
ompi_comm_reg_init();
|
||||||
|
|
||||||
|
/* initialize communicator requests (for ompi_comm_idup) */
|
||||||
|
ompi_comm_request_init ();
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,6 +307,9 @@ int ompi_comm_finalize(void)
|
|||||||
/* finalize the comm_reg stuff */
|
/* finalize the comm_reg stuff */
|
||||||
ompi_comm_reg_finalize();
|
ompi_comm_reg_finalize();
|
||||||
|
|
||||||
|
/* finalize communicator requests */
|
||||||
|
ompi_comm_request_fini ();
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +328,7 @@ int ompi_comm_link_function(void)
|
|||||||
|
|
||||||
static void ompi_comm_construct(ompi_communicator_t* comm)
|
static void ompi_comm_construct(ompi_communicator_t* comm)
|
||||||
{
|
{
|
||||||
comm->c_f_to_c_index = MPI_UNDEFINED;
|
comm->c_f_to_c_index = opal_pointer_array_add(&ompi_comm_f_to_c_table, comm);
|
||||||
comm->c_name[0] = '\0';
|
comm->c_name[0] = '\0';
|
||||||
comm->c_contextid = MPI_UNDEFINED;
|
comm->c_contextid = MPI_UNDEFINED;
|
||||||
comm->c_id_available = MPI_UNDEFINED;
|
comm->c_id_available = MPI_UNDEFINED;
|
||||||
@ -406,12 +420,19 @@ static void ompi_comm_destruct(ompi_communicator_t* comm)
|
|||||||
comm->error_handler = NULL;
|
comm->error_handler = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* mark this cid as available */
|
||||||
|
if ( MPI_UNDEFINED != comm->c_contextid &&
|
||||||
|
NULL != opal_pointer_array_get_item(&ompi_mpi_communicators,
|
||||||
|
comm->c_contextid)) {
|
||||||
|
opal_pointer_array_set_item ( &ompi_mpi_communicators,
|
||||||
|
comm->c_contextid, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* reset the ompi_comm_f_to_c_table entry */
|
/* reset the ompi_comm_f_to_c_table entry */
|
||||||
if ( MPI_UNDEFINED != comm->c_f_to_c_index &&
|
if ( MPI_UNDEFINED != comm->c_f_to_c_index &&
|
||||||
NULL != opal_pointer_array_get_item(&ompi_mpi_communicators,
|
NULL != opal_pointer_array_get_item(&ompi_comm_f_to_c_table,
|
||||||
comm->c_f_to_c_index )) {
|
comm->c_f_to_c_index)) {
|
||||||
opal_pointer_array_set_item ( &ompi_mpi_communicators,
|
opal_pointer_array_set_item ( &ompi_mpi_communicators,
|
||||||
comm->c_f_to_c_index, NULL);
|
comm->c_f_to_c_index, NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,7 @@ OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_communicator_t);
|
|||||||
|
|
||||||
|
|
||||||
OMPI_DECLSPEC extern opal_pointer_array_t ompi_mpi_communicators;
|
OMPI_DECLSPEC extern opal_pointer_array_t ompi_mpi_communicators;
|
||||||
|
OMPI_DECLSPEC extern opal_pointer_array_t ompi_comm_f_to_c_table;
|
||||||
|
|
||||||
struct ompi_communicator_t {
|
struct ompi_communicator_t {
|
||||||
opal_object_t c_base;
|
opal_object_t c_base;
|
||||||
|
@ -52,9 +52,9 @@ MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
|
|||||||
return an invalid C handle. */
|
return an invalid C handle. */
|
||||||
|
|
||||||
if ( 0 > o_index ||
|
if ( 0 > o_index ||
|
||||||
o_index >= opal_pointer_array_get_size(&ompi_mpi_communicators)) {
|
o_index >= opal_pointer_array_get_size(&ompi_comm_f_to_c_table)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (MPI_Comm)opal_pointer_array_get_item(&ompi_mpi_communicators, o_index);
|
return (MPI_Comm)opal_pointer_array_get_item(&ompi_comm_f_to_c_table, o_index);
|
||||||
}
|
}
|
||||||
|
@ -283,9 +283,6 @@ int ompi_mpi_finalize(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release resources held by comm requests */
|
|
||||||
ompi_comm_request_fini ();
|
|
||||||
|
|
||||||
if (OMPI_SUCCESS != (ret = ompi_message_finalize())) {
|
if (OMPI_SUCCESS != (ret = ompi_message_finalize())) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -871,9 +871,6 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare communicator requests */
|
|
||||||
ompi_comm_request_init ();
|
|
||||||
|
|
||||||
/* Init coll for the comms. This has to be after dpm_base_select,
|
/* Init coll for the comms. This has to be after dpm_base_select,
|
||||||
(since dpm.mark_dyncomm is not set in the communicator creation
|
(since dpm.mark_dyncomm is not set in the communicator creation
|
||||||
function else), but before dpm.dyncom_init, since this function
|
function else), but before dpm.dyncom_init, since this function
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user