Skip to content

Commit 08ab736

Browse files
authored
Merge pull request #23 from drwootton/comm_split_tests
Update cmsplit_type.c to add tests for communicator unguided split case
2 parents cb0f790 + 646bce9 commit 08ab736

File tree

1 file changed

+127
-10
lines changed

1 file changed

+127
-10
lines changed

comm_split_type/cmsplit_type.c

+127-10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <unistd.h>
1212
#include <string.h>
1313

14+
#define MAX_NUM_LEVELS 32
15+
1416
static const char *split_topo[] = {
1517
"mpi_shared_memory",
1618
"hwthread",
@@ -53,6 +55,12 @@ int main(int argc, char *argv[])
5355
int ret;
5456
int value = 0;
5557
int expected_value = 3;
58+
MPI_Comm hwcomm[MAX_NUM_LEVELS];
59+
int level_num = 0;
60+
char resource_type[100] = "";
61+
int has_key = 0;
62+
int old_size;
63+
int new_size, new_rank;
5664

5765
MPI_Init(&argc, &argv);
5866
MPI_Comm_rank(MPI_COMM_WORLD, &mcw_rank);
@@ -236,7 +244,7 @@ int main(int argc, char *argv[])
236244
MPI_Barrier(MPI_COMM_WORLD);
237245

238246
sync_hr();
239-
247+
240248
/*
241249
* Test MPI_COMM_TYPE_HW_GUIDED:
242250
* - info with correct key, but different values a different ranks, it must throw an error
@@ -293,34 +301,143 @@ int main(int argc, char *argv[])
293301
#endif
294302

295303
/* Test MPI_COMM_TYPE_HW_UNGUIDED:
296-
* - TODO
304+
* - Simple single iteration
297305
*/
298-
#if 0
299-
if (mcw_rank == 0 && verbose)
306+
if (mcw_rank == 0 && verbose) {
300307
printf("MPI_COMM_TYPE_HW_UNGUIDED: Trying basic\n");
308+
}
301309
MPI_Info_create(&info);
302310
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_HW_UNGUIDED, 0, info, &comm);
303311
if (comm != MPI_COMM_NULL) {
304-
int newsize;
305-
MPI_Comm_size(comm, &newsize);
306-
if (!(newsize < mcw_size)) {
312+
resource_type[0] = '\0';
313+
has_key = 0;
314+
315+
MPI_Comm_size(comm, &new_size);
316+
MPI_Comm_rank(comm, &new_rank);
317+
if (!(new_size < mcw_size)) {
307318
printf("MPI_COMM_TYPE_HW_UNGUIDED: Expected comm to be a proper sub communicator\n");
308319
errs++;
309320
}
310-
char resource_type[100] = "";
311-
int has_key = 0;
312321
MPI_Info_get(info, "mpi_hw_resource_type", 100, resource_type, &has_key);
313322
if (!has_key || strlen(resource_type) == 0) {
314323
printf("MPI_COMM_TYPE_HW_UNGUIDED: info for mpi_hw_resource_type not returned\n");
315324
errs++;
316325
}
317326

327+
if (new_rank == 0 && verbose) {
328+
printf("MPI_COMM_TYPE_HW_UNGUIDED (%s): %d/%d -> %d/%d Created shared subcommunicator\n",
329+
resource_type, mcw_rank, mcw_size, new_rank, new_size);
330+
}
331+
318332
MPI_Comm_free(&comm);
319333
}
320334
else if (mcw_rank == 0 && verbose) {
321335
printf("MPI_COMM_TYPE_HW_UNGUIDED: Returned MPI_COMM_NULL\n");
322336
}
323-
#endif
337+
MPI_Barrier(MPI_COMM_WORLD);
338+
339+
sync_hr();
340+
341+
/* Test MPI_COMM_TYPE_HW_UNGUIDED:
342+
* - Loop until all are NULL
343+
* Example 7.4 from MPI 4.0 standard
344+
*/
345+
hwcomm[level_num] = MPI_COMM_WORLD;
346+
347+
while((hwcomm[level_num] != MPI_COMM_NULL) && (level_num < MAX_NUM_LEVELS-1)) {
348+
MPI_Comm_rank(hwcomm[level_num], &rank);
349+
if (rank == 0 && verbose) {
350+
printf("MPI_COMM_TYPE_HW_UNGUIDED: (iter = %d) %d/%d Trying loop\n", level_num, mcw_rank, mcw_size);
351+
}
352+
MPI_Info_create(&info);
353+
MPI_Comm_split_type(hwcomm[level_num],
354+
MPI_COMM_TYPE_HW_UNGUIDED,
355+
rank, info, &hwcomm[level_num+1]);
356+
if (hwcomm[level_num+1] == MPI_COMM_NULL) {
357+
printf("MPI_COMM_TYPE_HW_UNGUIDED: (iter = %d) %d/%d Returned MPI_COMM_NULL\n", level_num, mcw_rank, mcw_size);
358+
} else if (hwcomm[level_num+1] == MPI_COMM_SELF) {
359+
printf("MPI_COMM_TYPE_HW_UNGUIDED: (iter = %d) %d/%d Returned MPI_COMM_SELF\n", level_num, mcw_rank, mcw_size);
360+
} else {
361+
MPI_Comm_rank(hwcomm[level_num+1], &rank);
362+
MPI_Comm_size(hwcomm[level_num], &old_size);
363+
MPI_Comm_size(hwcomm[level_num+1], &size);
364+
if (!(size < old_size)) {
365+
printf("MPI_COMM_TYPE_HW_UNGUIDED: Expected comm to be a proper sub communicator\n");
366+
errs++;
367+
}
368+
resource_type[0] = '\0';
369+
has_key = 0;
370+
MPI_Info_get(info, "mpi_hw_resource_type", 100, resource_type, &has_key);
371+
if (!has_key || strlen(resource_type) == 0) {
372+
printf("MPI_COMM_TYPE_HW_UNGUIDED: info for mpi_hw_resource_type not returned\n");
373+
errs++;
374+
}
375+
376+
if (rank == 0 && verbose) {
377+
printf("MPI_COMM_TYPE_HW_UNGUIDED: (iter = %d) %d/%d -> %d/%d Returned subcommunicator of (%s)\n",
378+
level_num,
379+
mcw_rank, mcw_size, rank, size,
380+
resource_type);
381+
}
382+
}
383+
level_num++;
384+
}
385+
MPI_Barrier(MPI_COMM_WORLD);
386+
387+
sync_hr();
388+
389+
/*
390+
* Test MPI_COMM_TYPE_HW_UNGUIDED:
391+
* - Single step
392+
* - Mix in some MPI_UNDEFINED values to make sure those are handled properly
393+
*/
394+
expected_value = 3;
395+
if (expected_value > mcw_size) {
396+
expected_value = mcw_size;
397+
}
398+
MPI_Info_create(&info);
399+
if (mcw_rank == 0 && verbose) {
400+
printf("MPI_COMM_TYPE_HW_UNGUIDED: Trying MPI Standard value %s with some MPI_UNDEFINED\n", "mpi_shared_memory");
401+
}
402+
if (mcw_rank < expected_value) {
403+
ret = MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_HW_UNGUIDED, 0, info, &comm);
404+
} else {
405+
ret = MPI_Comm_split_type(MPI_COMM_WORLD, MPI_UNDEFINED, 0, info, &comm);
406+
}
407+
if (ret != MPI_SUCCESS) {
408+
printf("MPI_COMM_TYPE_HW_UNGUIDED (%s) failed\n", split_topo[i]);
409+
errs++;
410+
} else if (comm != MPI_COMM_NULL) {
411+
resource_type[0] = '\0';
412+
has_key = 0;
413+
414+
MPI_Comm_rank(comm, &rank);
415+
MPI_Comm_size(comm, &new_size);
416+
if (!(new_size < mcw_size)) {
417+
printf("MPI_COMM_TYPE_HW_UNGUIDED: Expected comm to be a proper sub communicator\n");
418+
errs++;
419+
}
420+
MPI_Info_get(info, "mpi_hw_resource_type", 100, resource_type, &has_key);
421+
if (!has_key || strlen(resource_type) == 0) {
422+
printf("MPI_COMM_TYPE_HW_UNGUIDED: info for mpi_hw_resource_type not returned\n");
423+
errs++;
424+
}
425+
if (rank == 0 && verbose) {
426+
printf("MPI_COMM_TYPE_HW_UNGUIDED: %d/%d -> %d/%d Created shared subcommunicator of (%s)\n",
427+
mcw_rank, mcw_size, rank, new_size, resource_type);
428+
}
429+
MPI_Comm_free(&comm);
430+
value = 1;
431+
} else if (verbose) {
432+
value = 0;
433+
printf("MPI_COMM_TYPE_HW_UNGUIDED: %d/%d Returned MPI_COMM_NULL\n",
434+
mcw_rank, mcw_size);
435+
}
436+
MPI_Info_free(&info);
437+
438+
MPI_Barrier(MPI_COMM_WORLD);
439+
440+
sync_hr();
324441

325442
/*
326443
* All done - figure out if we passed

0 commit comments

Comments
 (0)