00001
00002
00003
00004 extern void abort (void);
00005
00006 void
00007 test1 (void)
00008 {
00009 int i = 0, j = 0;
00010 void bar (void)
00011 {
00012 i++;
00013 j++;
00014 }
00015 bar ();
00016 #pragma omp parallel for num_threads(4)
00017 for (i = 0; i < 100; i++)
00018 #pragma omp atomic
00019 j += 1;
00020 if (j != 101)
00021 abort ();
00022 #pragma omp parallel for lastprivate(i) num_threads(2)
00023 for (i = 0; i < 100; i++)
00024 #pragma omp atomic
00025 j += 1;
00026 if (i != 100)
00027 abort ();
00028 i = 3;
00029 bar ();
00030 if (j != 202)
00031 abort ();
00032 if (i != 4)
00033 abort ();
00034 }
00035
00036 void
00037 test2 (void)
00038 {
00039 int i = -1, j = 99, k, l = 9, m = 0;
00040 void bar (void)
00041 {
00042 i++;
00043 j++;
00044 l++;
00045 m++;
00046 }
00047 bar ();
00048 #pragma omp parallel for num_threads(4)
00049 for (k = i; k < j; k += l)
00050 #pragma omp atomic
00051 m += 1;
00052 bar ();
00053 if (i != 1 || j != 101 || l != 11 || m != 12)
00054 abort ();
00055 }
00056
00057 void
00058 test3 (void)
00059 {
00060 int i, j, k, l, m;
00061 void bar (void)
00062 {
00063 #pragma omp parallel for num_threads(4)
00064 for (i = j; i < k; i += l)
00065 #pragma omp atomic
00066 m += 1;
00067 }
00068 void baz (void)
00069 {
00070 #pragma omp parallel for num_threads(2) lastprivate(i)
00071 for (i = j; i < k * 2; i += l / 2)
00072 #pragma omp atomic
00073 m += 1;
00074 }
00075 i = 7;
00076 j = 0;
00077 k = 100;
00078 l = 2;
00079 m = 0;
00080 bar ();
00081 if (j != 0 || k != 100 || l != 2 || m != 50)
00082 abort ();
00083 baz ();
00084 if (i != 200 || j != 0 || k != 100 || l != 2 || m != 250)
00085 abort ();
00086 }
00087
00088 void
00089 test4 (void)
00090 {
00091 int i, j, k, l, m = 0;
00092 int foo (void)
00093 {
00094 return j;
00095 }
00096 int bar (void)
00097 {
00098 return k;
00099 }
00100 int baz (void)
00101 {
00102 return l;
00103 }
00104 j = 0;
00105 k = 1000;
00106 l = 2;
00107 #pragma omp parallel for num_threads(8) lastprivate(i)
00108 for (i = foo (); i < bar (); i += baz ())
00109 #pragma omp atomic
00110 m += 1;
00111 if (i != 1000 || m != 500 || j != 0 || k != 1000 || l != 2)
00112 abort ();
00113 }
00114
00115 int
00116 main (void)
00117 {
00118 test1 ();
00119 test2 ();
00120 test3 ();
00121 test4 ();
00122 return 0;
00123 }