LLVM OpenMP 19.0.0git
omp_for_schedule_static.c
Go to the documentation of this file.
1// RUN: %libomp-compile-and-run
2#include <stdio.h>
3#include <stdlib.h>
4#include "omp_testsuite.h"
5#include "omp_my_sleep.h"
6
7#define CFSMAX_SIZE 1000
8#define MAX_TIME 0.01
9
10#ifdef SLEEPTIME
11#undef SLEEPTIME
12#define SLEEPTIME 0.0005
13#endif
14
16{
17 int threads;
18 int i,lasttid;
19 int * tids;
20 int notout;
21 int maxiter;
22 int chunk_size;
23 int counter = 0;
24 int tmp_count=1;
25 int lastthreadsstarttid = -1;
26 int result = 1;
27
28 chunk_size = 7;
29 tids = (int *) malloc (sizeof (int) * (CFSMAX_SIZE + 1));
30 notout = 1;
31 maxiter = 0;
32
33 #pragma omp parallel shared(tids,counter)
34 { /* begin of parallel*/
35 #pragma omp single
36 {
37 threads = omp_get_num_threads ();
38 } /* end of single */
39 } /* end of parallel */
40
41 if (threads < 2) {
43 threads = 2;
44 }
45 fprintf (stderr,"Using an internal count of %d\nUsing a specified"
46 " chunksize of %d\n", CFSMAX_SIZE, chunk_size);
47 tids[CFSMAX_SIZE] = -1; /* setting endflag */
48 #pragma omp parallel shared(tids)
49 { /* begin of parallel */
50 double count;
51 int tid;
52 int j;
53
54 tid = omp_get_thread_num ();
55
56 #pragma omp for nowait schedule(static,chunk_size)
57 for(j = 0; j < CFSMAX_SIZE; ++j) {
58 count = 0.;
59 #pragma omp flush(maxiter)
60 if (j > maxiter) {
61 #pragma omp critical
62 {
63 maxiter = j;
64 }
65 }
66 /*printf ("thread %d sleeping\n", tid);*/
67 while (notout && (count < MAX_TIME) && (maxiter == j)) {
68 #pragma omp flush(maxiter,notout)
71 printf(".");
72 }
73#ifdef VERBOSE
74 if (count > 0.) printf(" waited %lf s\n", count);
75#endif
76 /*printf ("thread %d awake\n", tid);*/
77 tids[j] = tid;
78#ifdef VERBOSE
79 printf("%d finished by %d\n",j,tid);
80#endif
81 } /* end of for */
82 notout = 0;
83 #pragma omp flush(maxiter,notout)
84 } /* end of parallel */
85
86 /**** analysing the data in array tids ****/
87
88 lasttid = tids[0];
89 tmp_count = 0;
90
91 for (i = 0; i < CFSMAX_SIZE + 1; ++i) {
92 /* If the work was done by the same thread increase tmp_count by one. */
93 if (tids[i] == lasttid) {
94 tmp_count++;
95#ifdef VERBOSE
96 fprintf (stderr, "%d: %d \n", i, tids[i]);
97#endif
98 continue;
99 }
100
101 /* Check if the next thread had has the right thread number. When finding
102 * threadnumber -1 the end should be reached.
103 */
104 if (tids[i] == (lasttid + 1) % threads || tids[i] == -1) {
105 /* checking for the right chunk size */
106 if (tmp_count == chunk_size) {
107 tmp_count = 1;
108 lasttid = tids[i];
109#ifdef VERBOSE
110 fprintf (stderr, "OK\n");
111#endif
112 } else {
113 /* If the chunk size was wrong, check if the end was reached */
114 if (tids[i] == -1) {
115 if (i == CFSMAX_SIZE) {
116 fprintf (stderr, "Last thread had chunk size %d\n",
117 tmp_count);
118 break;
119 } else {
120 fprintf (stderr, "ERROR: Last thread (thread with"
121 " number -1) was found before the end.\n");
122 result = 0;
123 }
124 } else {
125 fprintf (stderr, "ERROR: chunk size was %d. (assigned"
126 " was %d)\n", tmp_count, chunk_size);
127 result = 0;
128 }
129 }
130 } else {
131 fprintf(stderr, "ERROR: Found thread with number %d (should be"
132 " inbetween 0 and %d).", tids[i], threads - 1);
133 result = 0;
134 }
135#ifdef VERBOSE
136 fprintf (stderr, "%d: %d \n", i, tids[i]);
137#endif
138 }
139
140 return result;
141}
142
143int main()
144{
145 int i;
146 int num_failed=0;
147
148 for(i = 0; i < REPETITIONS; i++) {
150 num_failed++;
151 }
152 }
153 return num_failed;
154}
int result[2]
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 count
#define i
Definition: kmp_stub.cpp:87
#define omp_set_num_threads
Definition: kmp_stub.cpp:34
int counter
Definition: kmp_taskloop.c:13
const int chunk_size
int test_omp_for_schedule_static()
#define CFSMAX_SIZE
#define MAX_TIME
int main()
static void my_sleep(double sleeptime)
Utility function to have a sleep function with better resolution and which only stops one thread.
Definition: omp_my_sleep.h:24
#define SLEEPTIME
Definition: omp_testsuite.h:16
#define REPETITIONS
Definition: omp_testsuite.h:13
int omp_get_num_threads()