@@ -972,7 +972,7 @@ static int ompi_instance_group_pmix_pset (ompi_instance_t *instance, const char
972972 return OMPI_ERR_OUT_OF_RESOURCE ;
973973 }
974974
975- for (size_t i = 0 ; i < size ; ++ i ) {
975+ for (size_t i = 0 ; i < ompi_process_info . num_procs ; ++ i ) {
976976 opal_process_name_t name = {.vpid = i , .jobid = OMPI_PROC_MY_NAME -> jobid };
977977 opal_value_t * val = NULL ;
978978 int ret ;
@@ -1020,17 +1020,83 @@ static int ompi_instance_group_pmix_pset (ompi_instance_t *instance, const char
10201020 return OMPI_SUCCESS ;
10211021}
10221022
1023+ static int ompi_instance_get_pmix_pset_size (ompi_instance_t * instance , const char * pset_name , size_t * size_out )
1024+ {
1025+ size_t size = 0 ;
1026+
1027+ for (size_t i = 0 ; i < ompi_process_info .num_procs ; ++ i ) {
1028+ opal_process_name_t name = {.vpid = i , .jobid = OMPI_PROC_MY_NAME -> jobid };
1029+ opal_value_t * val = NULL ;
1030+ int ret ;
1031+
1032+ ret = opal_pmix .get (& name , OPAL_PMIX_PSET_NAME , NULL , & val );
1033+ if (OPAL_UNLIKELY (OPAL_SUCCESS != ret )) {
1034+ return ret ;
1035+ }
1036+
1037+ size += (0 == strcmp (pset_name , val -> data .string ));
1038+ OBJ_RELEASE (val );
1039+
1040+ ++ size ;
1041+ }
1042+
1043+ * size_out = size ;
1044+
1045+ return OMPI_SUCCESS ;
1046+ }
1047+
10231048int ompi_group_from_pset (ompi_instance_t * instance , const char * pset_name , ompi_group_t * * group_out )
10241049{
1025- if (0 == strcmp (pset_name , "mpi://world" )) {
1050+ if (0 == strncmp (pset_name , "mpi://" , 6 )) {
1051+ pset_name += 6 ;
1052+ if (0 == strcmp (pset_name , "world" )) {
10261053 return ompi_instance_group_world (instance , group_out );
1054+ }
1055+ if (0 == strcmp (pset_name , "self" )) {
1056+ return ompi_instance_group_self (instance , group_out );
1057+ }
1058+ if (0 == strcmp (pset_name , "shared" )) {
1059+ return ompi_instance_group_shared (instance , group_out );
1060+ }
1061+ }
1062+
1063+ return ompi_instance_group_pmix_pset (instance , pset_name , group_out );
1064+ }
1065+
1066+ int ompi_instance_get_pset_info (ompi_instance_t * instance , const char * pset_name , opal_info_t * * info_used )
1067+ {
1068+ ompi_info_t * info = ompi_info_allocate ();
1069+ char tmp [16 ];
1070+ size_t size ;
1071+ int ret ;
1072+
1073+ * info_used = (opal_info_t * ) MPI_INFO_NULL ;
1074+
1075+ if (OPAL_UNLIKELY (NULL == info )) {
1076+ return OMPI_ERR_OUT_OF_RESOURCE ;
10271077 }
1028- if (0 == strcmp (pset_name , "mpi://self" )) {
1029- return ompi_instance_group_self (instance , group_out );
1078+
1079+ if (0 == strncmp (pset_name , "mpi://" , 6 )) {
1080+ pset_name += 6 ;
1081+ if (0 == strcmp (pset_name , "world" )) {
1082+ size = ompi_process_info .num_procs ;
1083+ } else if (0 == strcmp (pset_name , "self" )) {
1084+ size = 1 ;
1085+ } else if (0 == strcmp (pset_name , "shared" )) {
1086+ size = ompi_process_info .num_local_peers + 1 ;
1087+ }
1088+ } else {
1089+ ompi_instance_get_pmix_pset_size (instance , pset_name , & size );
10301090 }
1031- if (0 == strcmp (pset_name , "mpi://shared" )) {
1032- return ompi_instance_group_shared (instance , group_out );
1091+
1092+ snprintf (tmp , 16 , "%" PRIsize_t , size );
1093+ ret = opal_info_set (& info -> super , MPI_INFO_KEY_SESSION_PSET_SIZE , tmp );
1094+ if (OPAL_UNLIKELY (OPAL_SUCCESS != ret )) {
1095+ ompi_info_free (& info );
1096+ return ret ;
10331097 }
10341098
1035- return ompi_instance_group_pmix_pset (instance , pset_name , group_out );
1099+ * info_used = & info -> super ;
1100+
1101+ return OMPI_SUCCESS ;
10361102}
0 commit comments