| /* { dg-do run } */ | |
| /* { dg-set-target-env-var OMP_PROC_BIND "spread,close" } */ | |
| /* { dg-set-target-env-var OMP_PLACES "{6,7}:4:-2,!{2,3}" } */ | |
| /* { dg-set-target-env-var OMP_NUM_THREADS "2" } */ | |
| /* { dg-additional-options "-Wno-deprecated-declarations" } */ | |
| #include <omp.h> | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| int * | |
| get_buf (int nump) | |
| { | |
| static int *buf; | |
| static size_t buf_size; | |
| if ((size_t) nump > buf_size) | |
| { | |
| buf_size *= 2; | |
| if (nump > buf_size) | |
| buf_size = nump + 64; | |
| int *bufn = realloc (buf, buf_size * sizeof (int)); | |
| if (bufn == NULL) | |
| { | |
| fprintf (stderr, "memory allocation error\n"); | |
| exit (1); | |
| } | |
| buf = bufn; | |
| } | |
| return buf; | |
| } | |
| void | |
| print_place (int count, int *ids) | |
| { | |
| int i, j; | |
| printf ("{"); | |
| for (i = 0; i < count; i++) | |
| { | |
| for (j = i + 1; j < count; j++) | |
| if (ids[j] != ids[i] + (j - i)) | |
| break; | |
| if (i) | |
| printf (","); | |
| if (j == i + 1) | |
| printf ("%d", ids[i]); | |
| else | |
| { | |
| printf ("%d:%d", ids[i], j - i); | |
| i = j - 1; | |
| } | |
| } | |
| printf ("}\n"); | |
| } | |
| void | |
| print_place_var (void) | |
| { | |
| int place = omp_get_place_num (); | |
| int num_places = omp_get_partition_num_places (); | |
| int *ids = get_buf (num_places); | |
| omp_get_partition_place_nums (ids); | |
| printf ("place %d\n", place); | |
| if (num_places) | |
| printf ("partition %d-%d\n", ids[0], ids[num_places - 1]); | |
| } | |
| int | |
| main () | |
| { | |
| int i, num = omp_get_num_places (), nump, *ids; | |
| printf ("omp_get_num_places () == %d\n", num); | |
| for (i = 0; i < num; i++) | |
| { | |
| printf ("place %d ", i); | |
| nump = omp_get_place_num_procs (i); | |
| ids = get_buf (nump); | |
| omp_get_place_proc_ids (i, ids); | |
| print_place (nump, ids); | |
| } | |
| print_place_var (); | |
| omp_set_nested (1); | |
| #pragma omp parallel | |
| if (omp_get_thread_num () == omp_get_num_threads () - 1) | |
| { | |
| #pragma omp parallel | |
| if (omp_get_thread_num () == omp_get_num_threads () - 1) | |
| print_place_var (); | |
| } | |
| return 0; | |
| } |