00001
00002
00003 #include <omp.h>
00004 extern void abort ();
00005
00006 int l = 5;
00007
00008 int
00009 foo (int i)
00010 {
00011 int j = 7;
00012 const int k = 8;
00013 #pragma omp task firstprivate (i) shared (j, l)
00014 {
00015 #pragma omp critical
00016 {
00017 j += i;
00018 l += k;
00019 }
00020 }
00021 i++;
00022 #pragma omp task firstprivate (i) shared (j, l)
00023 {
00024 #pragma omp critical
00025 {
00026 j += i;
00027 l += k;
00028 }
00029 }
00030 i++;
00031 #pragma omp task firstprivate (i) shared (j, l)
00032 {
00033 #pragma omp critical
00034 {
00035 j += i;
00036 l += k;
00037 }
00038 }
00039 i++;
00040 #pragma omp task firstprivate (i) shared (j, l)
00041 {
00042 #pragma omp critical
00043 {
00044 j += i;
00045 l += k;
00046 }
00047 }
00048 i++;
00049 #pragma omp taskwait
00050 return (i != 8 * omp_get_thread_num () + 4
00051 || j != 4 * i - 3
00052 || k != 8);
00053 }
00054
00055 int
00056 main (void)
00057 {
00058 int r = 0;
00059 #pragma omp parallel num_threads (4) reduction(+:r)
00060 if (omp_get_num_threads () != 4)
00061 {
00062 #pragma omp master
00063 l = 133;
00064 }
00065 else if (foo (8 * omp_get_thread_num ()))
00066 r++;
00067 if (r || l != 133)
00068 abort ();
00069 return 0;
00070 }