mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* { 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" } */
 | |
| 
 | |
| #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;
 | |
| }
 |