4545#define PMI_MAX_VAL_LEN 4096 /* Maximum size of a PMI value */
4646
4747
48- #define PMI_CHECK () \
49- do { \
50- if (!pmi_init) { \
51- return PMI_FAIL; \
52- } \
48+ #define PMI_CHECK () \
49+ do { \
50+ if (!pmi_init) { \
51+ return PMI_FAIL; \
52+ } \
5353 } while (0)
5454
5555/* local functions */
5656static pmix_status_t convert_int (int * value , pmix_value_t * kv );
5757static int convert_err (pmix_status_t rc );
5858static pmix_proc_t myproc ;
5959static int pmi_init = 0 ;
60+ static bool pmi_singleton = false;
6061
6162PMIX_EXPORT int PMI_Init (int * spawned )
6263{
@@ -66,7 +67,19 @@ PMIX_EXPORT int PMI_Init(int *spawned)
6667 pmix_info_t info [1 ];
6768 bool val_optinal = 1 ;
6869
69- if (PMIX_SUCCESS != PMIx_Init (& myproc , NULL , 0 )) {
70+ if (PMIX_SUCCESS != (rc = PMIx_Init (& myproc , NULL , 0 ))) {
71+ /* if we didn't see a PMIx server (e.g., missing envar),
72+ * then allow us to run as a singleton */
73+ if (PMIX_ERR_INVALID_NAMESPACE == rc ) {
74+ if (NULL != spawned ) {
75+ * spawned = 0 ;
76+ }
77+ pmi_singleton = true;
78+ (void )strncpy (myproc .nspace , "1234" , PMIX_MAX_NSLEN );
79+ myproc .rank = 0 ;
80+ pmi_init = 1 ;
81+ return PMI_SUCCESS ;
82+ }
7083 return PMI_ERR_INIT ;
7184 }
7285
@@ -109,7 +122,11 @@ PMIX_EXPORT int PMI_Initialized(PMI_BOOL *initialized)
109122 return PMI_ERR_INVALID_ARG ;
110123 }
111124
112- * initialized = (PMIx_Initialized () ? PMI_TRUE : PMI_FALSE );
125+ if (pmi_singleton ) {
126+ * initialized = PMI_TRUE ;
127+ } else {
128+ * initialized = (PMIx_Initialized () ? PMI_TRUE : PMI_FALSE );
129+ }
113130
114131 return PMI_SUCCESS ;
115132}
@@ -120,6 +137,10 @@ PMIX_EXPORT int PMI_Finalize(void)
120137
121138 PMI_CHECK ();
122139
140+ if (pmi_singleton ) {
141+ return PMI_SUCCESS ;
142+ }
143+
123144 pmi_init = 0 ;
124145 rc = PMIx_Finalize (NULL , 0 );
125146 return convert_err (rc );
@@ -131,6 +152,10 @@ PMIX_EXPORT int PMI_Abort(int flag, const char msg[])
131152
132153 PMI_CHECK ();
133154
155+ if (pmi_singleton ) {
156+ return PMI_SUCCESS ;
157+ }
158+
134159 rc = PMIx_Abort (flag , msg , NULL , 0 );
135160 return convert_err (rc );
136161}
@@ -153,6 +178,9 @@ PMIX_EXPORT int PMI_KVS_Put(const char kvsname[], const char key[], const char v
153178 if ((value == NULL ) || (strlen (value ) > PMI_MAX_VAL_LEN )) {
154179 return PMI_ERR_INVALID_VAL ;
155180 }
181+ if (pmi_singleton ) {
182+ return PMI_SUCCESS ;
183+ }
156184
157185 pmix_output_verbose (2 , pmix_globals .debug_output ,
158186 "PMI_KVS_Put: KVS=%s, key=%s value=%s" , kvsname , key , value );
@@ -173,6 +201,9 @@ PMIX_EXPORT int PMI_KVS_Commit(const char kvsname[])
173201 if ((kvsname == NULL ) || (strlen (kvsname ) > PMI_MAX_KVSNAME_LEN )) {
174202 return PMI_ERR_INVALID_KVS ;
175203 }
204+ if (pmi_singleton ) {
205+ return PMI_SUCCESS ;
206+ }
176207
177208 pmix_output_verbose (2 , pmix_globals .debug_output , "PMI_KVS_Commit: KVS=%s" ,
178209 kvsname );
@@ -256,6 +287,10 @@ PMIX_EXPORT int PMI_Barrier(void)
256287
257288 PMI_CHECK ();
258289
290+ if (pmi_singleton ) {
291+ return PMI_SUCCESS ;
292+ }
293+
259294 info = & buf ;
260295 PMIX_INFO_CONSTRUCT (info );
261296 PMIX_INFO_LOAD (info , PMIX_COLLECT_DATA , & val , PMIX_BOOL );
@@ -282,6 +317,11 @@ PMIX_EXPORT int PMI_Get_size(int *size)
282317 return PMI_ERR_INVALID_ARG ;
283318 }
284319
320+ if (pmi_singleton ) {
321+ * size = 1 ;
322+ return PMI_SUCCESS ;
323+ }
324+
285325 /* set controlling parameters
286326 * PMIX_OPTIONAL - expect that these keys should be available on startup
287327 */
@@ -326,6 +366,11 @@ PMIX_EXPORT int PMI_Get_universe_size(int *size)
326366 return PMI_ERR_INVALID_ARG ;
327367 }
328368
369+ if (pmi_singleton ) {
370+ * size = 1 ;
371+ return PMI_SUCCESS ;
372+ }
373+
329374 /* set controlling parameters
330375 * PMIX_OPTIONAL - expect that these keys should be available on startup
331376 */
@@ -358,6 +403,11 @@ PMIX_EXPORT int PMI_Get_appnum(int *appnum)
358403 return PMI_ERR_INVALID_ARG ;
359404 }
360405
406+ if (pmi_singleton ) {
407+ * appnum = 0 ;
408+ return PMI_SUCCESS ;
409+ }
410+
361411 /* set controlling parameters
362412 * PMIX_OPTIONAL - expect that these keys should be available on startup
363413 */
@@ -390,6 +440,10 @@ PMIX_EXPORT int PMI_Publish_name(const char service_name[], const char port[])
390440 return PMI_ERR_INVALID_ARG ;
391441 }
392442
443+ if (pmi_singleton ) {
444+ return PMI_FAIL ;
445+ }
446+
393447 /* pass the service/port */
394448 (void ) strncpy (info .key , service_name , PMIX_MAX_KEYLEN );
395449 info .value .type = PMIX_STRING ;
@@ -413,6 +467,10 @@ PMIX_EXPORT int PMI_Unpublish_name(const char service_name[])
413467 return PMI_ERR_INVALID_ARG ;
414468 }
415469
470+ if (pmi_singleton ) {
471+ return PMI_FAIL ;
472+ }
473+
416474 /* pass the service */
417475 keys [0 ] = (char * ) service_name ;
418476 keys [1 ] = NULL ;
@@ -432,6 +490,10 @@ PMIX_EXPORT int PMI_Lookup_name(const char service_name[], char port[])
432490 return PMI_ERR_INVALID_ARG ;
433491 }
434492
493+ if (pmi_singleton ) {
494+ return PMI_FAIL ;
495+ }
496+
435497 PMIX_PDATA_CONSTRUCT (& pdata );
436498
437499 /* pass the service */
@@ -512,6 +574,11 @@ PMIX_EXPORT int PMI_Get_clique_size(int *size)
512574 return PMI_ERR_INVALID_ARG ;
513575 }
514576
577+ if (pmi_singleton ) {
578+ * size = 1 ;
579+ return PMI_SUCCESS ;
580+ }
581+
515582 /* set controlling parameters
516583 * PMIX_OPTIONAL - expect that these keys should be available on startup
517584 */
@@ -544,6 +611,11 @@ PMIX_EXPORT int PMI_Get_clique_ranks(int ranks[], int length)
544611 return PMI_ERR_INVALID_ARGS ;
545612 }
546613
614+ if (pmi_singleton ) {
615+ ranks [0 ] = 0 ;
616+ return PMI_SUCCESS ;
617+ }
618+
547619 rc = PMIx_Get (& proc , PMIX_LOCAL_PEERS , NULL , 0 , & val );
548620 if (PMIX_SUCCESS == rc ) {
549621 /* kv will contain a string of comma-separated
@@ -655,6 +727,10 @@ PMIX_EXPORT int PMI_Spawn_multiple(int count,
655727 return PMI_ERR_INVALID_ARG ;
656728 }
657729
730+ if (pmi_singleton ) {
731+ return PMI_FAIL ;
732+ }
733+
658734 /* setup the apps */
659735 PMIX_APP_CREATE (apps , count );
660736 for (i = 0 ; i < count ; i ++ ) {
0 commit comments