14c4bda16SSaiyedul Islam // RUN: %libomp-compile
24c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=0 %libomp-run
34c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=1 %libomp-run
44c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=3 %libomp-run
54c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=4 %libomp-run
6067325f9SJonathan Peyton // RUN: env KMP_DISP_NUM_BUFFERS=7 %libomp-run
74c4bda16SSaiyedul Islam // RUN: %libomp-compile -DMY_SCHEDULE=guided
84c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=1 %libomp-run
94c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=3 %libomp-run
104c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=4 %libomp-run
114c4bda16SSaiyedul Islam // RUN: env KMP_DISP_NUM_BUFFERS=7 %libomp-run
12*5dd4d0d4SAndreyChurbanov // UNSUPPORTED: clang-11, clang-12
13067325f9SJonathan Peyton #include <stdio.h>
14067325f9SJonathan Peyton #include <omp.h>
15067325f9SJonathan Peyton #include <stdlib.h>
16067325f9SJonathan Peyton #include <limits.h>
17067325f9SJonathan Peyton #include "omp_testsuite.h"
18067325f9SJonathan Peyton
19067325f9SJonathan Peyton #define INCR 7
20067325f9SJonathan Peyton #define MY_MAX 200
21067325f9SJonathan Peyton #define MY_MIN -200
22067325f9SJonathan Peyton #define NUM_LOOPS 100
23067325f9SJonathan Peyton #ifndef MY_SCHEDULE
24067325f9SJonathan Peyton # define MY_SCHEDULE dynamic
25067325f9SJonathan Peyton #endif
26067325f9SJonathan Peyton
27067325f9SJonathan Peyton int a, b, a_known_value, b_known_value;
28067325f9SJonathan Peyton
test_kmp_set_disp_num_buffers()29067325f9SJonathan Peyton int test_kmp_set_disp_num_buffers()
30067325f9SJonathan Peyton {
31067325f9SJonathan Peyton int success = 1;
32067325f9SJonathan Peyton a = 0;
33067325f9SJonathan Peyton b = 0;
34067325f9SJonathan Peyton // run many small dynamic loops to stress the dispatch buffer system
35067325f9SJonathan Peyton #pragma omp parallel
36067325f9SJonathan Peyton {
37067325f9SJonathan Peyton int i,j;
38067325f9SJonathan Peyton for (j = 0; j < NUM_LOOPS; j++) {
39067325f9SJonathan Peyton #pragma omp for schedule(MY_SCHEDULE) nowait
40067325f9SJonathan Peyton for (i = MY_MIN; i < MY_MAX; i+=INCR) {
41067325f9SJonathan Peyton #pragma omp atomic
42067325f9SJonathan Peyton a++;
43067325f9SJonathan Peyton }
44067325f9SJonathan Peyton #pragma omp for schedule(MY_SCHEDULE) nowait
45067325f9SJonathan Peyton for (i = MY_MAX; i >= MY_MIN; i-=INCR) {
46067325f9SJonathan Peyton #pragma omp atomic
47067325f9SJonathan Peyton b++;
48067325f9SJonathan Peyton }
49067325f9SJonathan Peyton }
50067325f9SJonathan Peyton }
51067325f9SJonathan Peyton // detect failure
52067325f9SJonathan Peyton if (a != a_known_value || b != b_known_value) {
53067325f9SJonathan Peyton success = 0;
54067325f9SJonathan Peyton printf("a = %d (should be %d), b = %d (should be %d)\n", a, a_known_value,
55067325f9SJonathan Peyton b, b_known_value);
56067325f9SJonathan Peyton }
57067325f9SJonathan Peyton return success;
58067325f9SJonathan Peyton }
59067325f9SJonathan Peyton
main(int argc,char ** argv)60067325f9SJonathan Peyton int main(int argc, char** argv)
61067325f9SJonathan Peyton {
62067325f9SJonathan Peyton int i,j;
63067325f9SJonathan Peyton int num_failed=0;
64067325f9SJonathan Peyton
65067325f9SJonathan Peyton // figure out the known values to compare with calculated result
66067325f9SJonathan Peyton a_known_value = 0;
67067325f9SJonathan Peyton b_known_value = 0;
68067325f9SJonathan Peyton
69067325f9SJonathan Peyton for (j = 0; j < NUM_LOOPS; j++) {
70067325f9SJonathan Peyton for (i = MY_MIN; i < MY_MAX; i+=INCR)
71067325f9SJonathan Peyton a_known_value++;
72067325f9SJonathan Peyton for (i = MY_MAX; i >= MY_MIN; i-=INCR)
73067325f9SJonathan Peyton b_known_value++;
74067325f9SJonathan Peyton }
75067325f9SJonathan Peyton
76067325f9SJonathan Peyton for(i = 0; i < REPETITIONS; i++) {
77067325f9SJonathan Peyton if(!test_kmp_set_disp_num_buffers()) {
78067325f9SJonathan Peyton num_failed++;
79067325f9SJonathan Peyton }
80067325f9SJonathan Peyton }
81*5dd4d0d4SAndreyChurbanov if (num_failed == 0)
82*5dd4d0d4SAndreyChurbanov printf("passed\n");
83*5dd4d0d4SAndreyChurbanov else
84*5dd4d0d4SAndreyChurbanov printf("failed %d\n", num_failed);
85067325f9SJonathan Peyton return num_failed;
86067325f9SJonathan Peyton }
87