LLVM OpenMP 19.0.0git
omp_threadprivate.c
Go to the documentation of this file.
1// RUN: %libomp-compile-and-run
2/*
3 * Threadprivate is tested in 2 ways:
4 * 1. The global variable declared as threadprivate should have
5 * local copy for each thread. Otherwise race condition and
6 * wrong result.
7 * 2. If the value of local copy is retained for the two adjacent
8 * parallel regions
9 */
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
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;
31
32 #pragma omp parallel private(i)
33 {
34 sum0 = 0;
35 #pragma omp for
36 for (i = 1; i <= LOOPCOUNT; i++) {
37 sum0 = sum0 + i;
38 } /*end of for*/
39 #pragma omp critical
40 {
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*/
51 #pragma omp parallel
52 {
53 #pragma omp master
54 {
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 is
63 called inside serial region*/
64
65 /* the first parallel region is used to initialize myvalue
66 and the array with my_random+rank */
67 #pragma omp parallel
68 {
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 the
75 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++) {
98 num_failed++;
99 }
100 }
101 return num_failed;
102}
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void * data
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope ITT_FORMAT d const __itt_domain __itt_scope __itt_string_handle const char size_t ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_relation __itt_id ITT_FORMAT lu __itt_track_group __itt_string_handle __itt_track_group_type ITT_FORMAT d __itt_track ITT_FORMAT p void int rank
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
#define i
Definition: kmp_stub.cpp:87
#define omp_set_dynamic
Definition: kmp_stub.cpp:35
#define LOOPCOUNT
Definition: omp_testsuite.h:12
#define REPETITIONS
Definition: omp_testsuite.h:13
int test_omp_threadprivate()
static int myvalue
int main()
static int sum0
int omp_get_num_threads()