|
11 | 11 | #include <unistd.h>
|
12 | 12 | #include <string.h>
|
13 | 13 |
|
| 14 | +#define MAX_NUM_LEVELS 32 |
| 15 | + |
14 | 16 | static const char *split_topo[] = {
|
15 | 17 | "mpi_shared_memory",
|
16 | 18 | "hwthread",
|
@@ -53,6 +55,12 @@ int main(int argc, char *argv[])
|
53 | 55 | int ret;
|
54 | 56 | int value = 0;
|
55 | 57 | 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; |
56 | 64 |
|
57 | 65 | MPI_Init(&argc, &argv);
|
58 | 66 | MPI_Comm_rank(MPI_COMM_WORLD, &mcw_rank);
|
@@ -236,7 +244,7 @@ int main(int argc, char *argv[])
|
236 | 244 | MPI_Barrier(MPI_COMM_WORLD);
|
237 | 245 |
|
238 | 246 | sync_hr();
|
239 |
| - |
| 247 | + |
240 | 248 | /*
|
241 | 249 | * Test MPI_COMM_TYPE_HW_GUIDED:
|
242 | 250 | * - 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[])
|
293 | 301 | #endif
|
294 | 302 |
|
295 | 303 | /* Test MPI_COMM_TYPE_HW_UNGUIDED:
|
296 |
| - * - TODO |
| 304 | + * - Simple single iteration |
297 | 305 | */
|
298 |
| -#if 0 |
299 |
| - if (mcw_rank == 0 && verbose) |
| 306 | + if (mcw_rank == 0 && verbose) { |
300 | 307 | printf("MPI_COMM_TYPE_HW_UNGUIDED: Trying basic\n");
|
| 308 | + } |
301 | 309 | MPI_Info_create(&info);
|
302 | 310 | MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_HW_UNGUIDED, 0, info, &comm);
|
303 | 311 | 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)) { |
307 | 318 | printf("MPI_COMM_TYPE_HW_UNGUIDED: Expected comm to be a proper sub communicator\n");
|
308 | 319 | errs++;
|
309 | 320 | }
|
310 |
| - char resource_type[100] = ""; |
311 |
| - int has_key = 0; |
312 | 321 | MPI_Info_get(info, "mpi_hw_resource_type", 100, resource_type, &has_key);
|
313 | 322 | if (!has_key || strlen(resource_type) == 0) {
|
314 | 323 | printf("MPI_COMM_TYPE_HW_UNGUIDED: info for mpi_hw_resource_type not returned\n");
|
315 | 324 | errs++;
|
316 | 325 | }
|
317 | 326 |
|
| 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 | + |
318 | 332 | MPI_Comm_free(&comm);
|
319 | 333 | }
|
320 | 334 | else if (mcw_rank == 0 && verbose) {
|
321 | 335 | printf("MPI_COMM_TYPE_HW_UNGUIDED: Returned MPI_COMM_NULL\n");
|
322 | 336 | }
|
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(); |
324 | 441 |
|
325 | 442 | /*
|
326 | 443 | * All done - figure out if we passed
|
|
0 commit comments