1614c7ef8SJonathan Peyton // RUN: %libomp-compile-and-run 2614c7ef8SJonathan Peyton /* 3614c7ef8SJonathan Peyton * Threadprivate is tested in 2 ways: 4614c7ef8SJonathan Peyton * 1. The global variable declared as threadprivate should have 5614c7ef8SJonathan Peyton * local copy for each thread. Otherwise race condition and 6614c7ef8SJonathan Peyton * wrong result. 7614c7ef8SJonathan Peyton * 2. If the value of local copy is retained for the two adjacent 8614c7ef8SJonathan Peyton * parallel regions 9614c7ef8SJonathan Peyton */ 10614c7ef8SJonathan Peyton #include "omp_testsuite.h" 11614c7ef8SJonathan Peyton #include <stdlib.h> 12614c7ef8SJonathan Peyton #include <stdio.h> 13614c7ef8SJonathan Peyton 14614c7ef8SJonathan Peyton static int sum0=0; 15614c7ef8SJonathan Peyton static int myvalue = 0; 16614c7ef8SJonathan Peyton 17614c7ef8SJonathan Peyton #pragma omp threadprivate(sum0) 18614c7ef8SJonathan Peyton #pragma omp threadprivate(myvalue) 19614c7ef8SJonathan Peyton test_omp_threadprivate()20614c7ef8SJonathan Peytonint test_omp_threadprivate() 21614c7ef8SJonathan Peyton { 22614c7ef8SJonathan Peyton int sum = 0; 23614c7ef8SJonathan Peyton int known_sum; 24614c7ef8SJonathan Peyton int i; 25614c7ef8SJonathan Peyton int iter; 26614c7ef8SJonathan Peyton int *data; 27614c7ef8SJonathan Peyton int size; 28614c7ef8SJonathan Peyton int num_failed = 0; 29614c7ef8SJonathan Peyton int my_random; 30614c7ef8SJonathan Peyton omp_set_dynamic(0); 31614c7ef8SJonathan Peyton 32614c7ef8SJonathan Peyton #pragma omp parallel private(i) 33614c7ef8SJonathan Peyton { 34614c7ef8SJonathan Peyton sum0 = 0; 35614c7ef8SJonathan Peyton #pragma omp for 36614c7ef8SJonathan Peyton for (i = 1; i <= LOOPCOUNT; i++) { 37614c7ef8SJonathan Peyton sum0 = sum0 + i; 38614c7ef8SJonathan Peyton } /*end of for*/ 39614c7ef8SJonathan Peyton #pragma omp critical 40614c7ef8SJonathan Peyton { 41614c7ef8SJonathan Peyton sum = sum + sum0; 42614c7ef8SJonathan Peyton } /*end of critical */ 43614c7ef8SJonathan Peyton } /* end of parallel */ 44614c7ef8SJonathan Peyton known_sum = (LOOPCOUNT * (LOOPCOUNT + 1)) / 2; 45614c7ef8SJonathan Peyton if (known_sum != sum ) { 46614c7ef8SJonathan Peyton fprintf (stderr, " known_sum = %d, sum = %d\n", known_sum, sum); 47614c7ef8SJonathan Peyton } 48614c7ef8SJonathan Peyton 49614c7ef8SJonathan Peyton /* the next parallel region is just used to get the number of threads*/ 50614c7ef8SJonathan Peyton omp_set_dynamic(0); 51614c7ef8SJonathan Peyton #pragma omp parallel 52614c7ef8SJonathan Peyton { 53614c7ef8SJonathan Peyton #pragma omp master 54614c7ef8SJonathan Peyton { 55614c7ef8SJonathan Peyton size=omp_get_num_threads(); 56614c7ef8SJonathan Peyton data=(int*) malloc(size*sizeof(int)); 57614c7ef8SJonathan Peyton } 58614c7ef8SJonathan Peyton }/* end parallel*/ 59614c7ef8SJonathan Peyton 60614c7ef8SJonathan Peyton srand(45); 61614c7ef8SJonathan Peyton for (iter = 0; iter < 100; iter++) { 62614c7ef8SJonathan Peyton my_random = rand(); /* random number generator is 63614c7ef8SJonathan Peyton called inside serial region*/ 64614c7ef8SJonathan Peyton 65*4c6a098aSKazuaki Ishizaki /* the first parallel region is used to initialize myvalue 66614c7ef8SJonathan Peyton and the array with my_random+rank */ 67614c7ef8SJonathan Peyton #pragma omp parallel 68614c7ef8SJonathan Peyton { 69614c7ef8SJonathan Peyton int rank; 70614c7ef8SJonathan Peyton rank = omp_get_thread_num (); 71614c7ef8SJonathan Peyton myvalue = data[rank] = my_random + rank; 72614c7ef8SJonathan Peyton } 73614c7ef8SJonathan Peyton 74614c7ef8SJonathan Peyton /* the second parallel region verifies that the 75614c7ef8SJonathan Peyton value of "myvalue" is retained */ 76614c7ef8SJonathan Peyton #pragma omp parallel reduction(+:num_failed) 77614c7ef8SJonathan Peyton { 78614c7ef8SJonathan Peyton int rank; 79614c7ef8SJonathan Peyton rank = omp_get_thread_num (); 80614c7ef8SJonathan Peyton num_failed = num_failed + (myvalue != data[rank]); 81614c7ef8SJonathan Peyton if(myvalue != data[rank]) { 82614c7ef8SJonathan Peyton fprintf (stderr, " myvalue = %d, data[rank]= %d\n", 83614c7ef8SJonathan Peyton myvalue, data[rank]); 84614c7ef8SJonathan Peyton } 85614c7ef8SJonathan Peyton } 86614c7ef8SJonathan Peyton } 87614c7ef8SJonathan Peyton free (data); 88614c7ef8SJonathan Peyton return (known_sum == sum) && !num_failed; 89614c7ef8SJonathan Peyton } /* end of check_threadprivate*/ 90614c7ef8SJonathan Peyton main()91614c7ef8SJonathan Peytonint main() 92614c7ef8SJonathan Peyton { 93614c7ef8SJonathan Peyton int i; 94614c7ef8SJonathan Peyton int num_failed=0; 95614c7ef8SJonathan Peyton 96614c7ef8SJonathan Peyton for(i = 0; i < REPETITIONS; i++) { 97614c7ef8SJonathan Peyton if(!test_omp_threadprivate()) { 98614c7ef8SJonathan Peyton num_failed++; 99614c7ef8SJonathan Peyton } 100614c7ef8SJonathan Peyton } 101614c7ef8SJonathan Peyton return num_failed; 102614c7ef8SJonathan Peyton } 103