00001
00002
00003 #include <omp.h>
00004
00005 extern void abort (void);
00006
00007 int
00008 main (void)
00009 {
00010 int i = 5, l = 0;
00011 int foo (void) { return i == 6; }
00012 int bar (void) { return i - 3; }
00013
00014 omp_set_dynamic (0);
00015
00016 #pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l)
00017 if (omp_get_num_threads () != 1)
00018 l = 1;
00019
00020 i++;
00021
00022 #pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l)
00023 if (omp_get_num_threads () != 3)
00024 l = 1;
00025
00026 i++;
00027
00028 #pragma omp master
00029 if (bar () != 4)
00030 abort ();
00031
00032 #pragma omp single
00033 {
00034 if (foo ())
00035 abort ();
00036 i--;
00037 if (! foo ())
00038 abort ();
00039 }
00040
00041 if (l)
00042 abort ();
00043
00044 i = 8;
00045 #pragma omp atomic
00046 l += bar ();
00047
00048 if (l != 5)
00049 abort ();
00050
00051 return 0;
00052 }