103 lines · c
1// RUN: %libomp-compile-and-run2/*3 * Threadprivate is tested in 2 ways:4 * 1. The global variable declared as threadprivate should have5 * local copy for each thread. Otherwise race condition and6 * wrong result.7 * 2. If the value of local copy is retained for the two adjacent8 * parallel regions9 */10#include "omp_testsuite.h"11#include <stdlib.h>12#include <stdio.h>13 14static int sum0=0;15static int myvalue = 0;16 17#pragma omp threadprivate(sum0)18#pragma omp threadprivate(myvalue)19 20int test_omp_threadprivate()21{22 int sum = 0;23 int known_sum;24 int i;25 int iter;26 int *data;27 int size;28 int num_failed = 0;29 int my_random;30 omp_set_dynamic(0);31 32 #pragma omp parallel private(i)33 {34 sum0 = 0;35 #pragma omp for36 for (i = 1; i <= LOOPCOUNT; i++) {37 sum0 = sum0 + i;38 } /*end of for*/39 #pragma omp critical40 {41 sum = sum + sum0;42 } /*end of critical */43 } /* end of parallel */44 known_sum = (LOOPCOUNT * (LOOPCOUNT + 1)) / 2;45 if (known_sum != sum ) {46 fprintf (stderr, " known_sum = %d, sum = %d\n", known_sum, sum);47 }48 49 /* the next parallel region is just used to get the number of threads*/50 omp_set_dynamic(0);51 #pragma omp parallel52 {53 #pragma omp master54 {55 size=omp_get_num_threads();56 data=(int*) malloc(size*sizeof(int));57 }58 }/* end parallel*/59 60 srand(45);61 for (iter = 0; iter < 100; iter++) {62 my_random = rand(); /* random number generator is63 called inside serial region*/64 65 /* the first parallel region is used to initialize myvalue66 and the array with my_random+rank */67 #pragma omp parallel68 {69 int rank;70 rank = omp_get_thread_num ();71 myvalue = data[rank] = my_random + rank;72 }73 74 /* the second parallel region verifies that the75 value of "myvalue" is retained */76 #pragma omp parallel reduction(+:num_failed)77 {78 int rank;79 rank = omp_get_thread_num ();80 num_failed = num_failed + (myvalue != data[rank]);81 if(myvalue != data[rank]) {82 fprintf (stderr, " myvalue = %d, data[rank]= %d\n",83 myvalue, data[rank]);84 }85 }86 }87 free (data);88 return (known_sum == sum) && !num_failed;89} /* end of check_threadprivate*/90 91int main()92{93 int i;94 int num_failed=0;95 96 for(i = 0; i < REPETITIONS; i++) {97 if(!test_omp_threadprivate()) {98 num_failed++;99 }100 }101 return num_failed;102}103