mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do run } */
 | |
| /* { dg-set-target-env-var OMP_MAX_TASK_PRIORITY "10" } */
 | |
| 
 | |
| /* This test verifies that the "priority" clause of omp task works as
 | |
|    advertised.
 | |
| 
 | |
|    Testing the OpenMP task scheduler is a bit tricky, especially when
 | |
|    trying to determine what ran first (without explicitly calling
 | |
|    time() and/or synchronizing between threads).  What we do here is
 | |
|    run in single threaded mode which guarantees that we won't run into
 | |
|    data races while accessing the "prio" array.
 | |
| 
 | |
|    We give each task a priority from 0..63, while setting
 | |
|    OMP_MAX_TASK_PRIORITY to 10, which basically gives us 10 lower
 | |
|    priority tasks, and the rest scheduled to run earlier.  We verify
 | |
|    that the priority < 10 tasks run last.  */
 | |
| 
 | |
| #include <omp.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #define N 64
 | |
| 
 | |
| int main()
 | |
| {
 | |
|   int tsknum=0, prio[N];
 | |
|   int max_priority = omp_get_max_task_priority ();
 | |
|   int saved_tsknum = -1;
 | |
|   int i;
 | |
| 
 | |
| #pragma omp parallel num_threads(1)
 | |
| #pragma omp single private (i)
 | |
|   {
 | |
|     for (i = 0; i < N; i++)
 | |
|       #pragma omp task priority(i ^ 1)
 | |
|       {
 | |
| 	int t;
 | |
| 	#pragma omp atomic capture seq_cst
 | |
| 	t = tsknum++;
 | |
| 	prio[t] = i ^ 1;
 | |
|       }
 | |
|     #pragma omp atomic read seq_cst
 | |
|     saved_tsknum = tsknum;
 | |
|   }
 | |
| 
 | |
|   /* If any of the tasks have run before all tasks were created, don't
 | |
|      make any assumption on the task order.  Otherwise, we should have
 | |
|      tasks with >= max_priority scheduled first in arbitrary order,
 | |
|      followed by the rest of tasks in decreasing priority order, as
 | |
|      there is only one thread that can schedule them.  */
 | |
|   if (saved_tsknum == 0)
 | |
|     {
 | |
|       for (i = 0; i < N; i++)
 | |
| 	if (i < N - max_priority)
 | |
| 	  {
 | |
| 	    if (prio[i] < max_priority)
 | |
| 	      abort ();
 | |
| 	  }
 | |
| 	else if (i != N - prio[i] - 1)
 | |
| 	  abort ();
 | |
|     }
 | |
|   return 0;
 | |
| }
 |