Merge branch 'charm' into amicableErrorMessages
[charm.git] / examples / multiphaseSharedArrays / simpletest / t3.C
1 // -*- mode: c++; tab-width: 4 -*-
2 #include "msa/msa.h"
3
4
5 typedef MSA::MSA2D<double, DefaultEntry<double>, MSA_DEFAULT_ENTRIES_PER_PAGE, MSA_ROW_MAJOR> MSA2DRM;
6
7 #include "t3.decl.h"
8
9 #include <assert.h>
10 #include <math.h>
11 #include "params.h"
12
13 #define NO_PREFETCH
14 int g_prefetch = -1;
15
16 // debugging
17 const int do_message = 0;
18
19 const double epsilon = 0.00000001;
20 inline int notequal(double v1, double v2)
21 {
22     return (fabs(v1 - v2) > epsilon);
23 }
24
25 class t3 : public CBase_t3
26 {
27 protected:
28     double start_time;
29     CProxy_TestArray workers;
30     int reallyDone;
31
32 public:
33     t3(CkArgMsg* m)
34     {
35         // Usage: t3 [number_of_worker_threads [max_bytes]]
36         if(m->argc >1 ) NUM_WORKERS=atoi(m->argv[1]);
37         if(m->argc >2 ) bytes=atoi(m->argv[1]);
38         delete m;
39         reallyDone = 0;
40
41         // Actually build the shared array.
42         MSA2DRM arr1(ROWS1, COLS1, NUM_WORKERS, bytes);
43
44         workers = CProxy_TestArray::ckNew(arr1, NUM_WORKERS, NUM_WORKERS);
45         workers.ckSetReductionClient(new CkCallback(CkIndex_t3::done(NULL), thisProxy));
46
47         start_time = CkWallTimer();
48         workers.Start();
49     }
50
51     void done(CkReductionMsg* m)
52     {
53         delete m;
54
55         if (reallyDone == 0) {
56             workers.Kontinue();
57             reallyDone++;
58             double end_time = CkWallTimer();
59
60             const char TAB = '\t';
61
62         ckout << ROWS1 << TAB
63               << COLS1 << TAB
64               << NUM_WORKERS << TAB
65               << bytes << TAB
66               << ((g_prefetch == 0) ? "N" : ((g_prefetch == 1) ? "Y" : "U")) << TAB
67               << end_time - start_time
68               << endl;
69         } else {
70
71             CkExit();
72         }
73     }
74 };
75
76
77 void GetMyIndices(unsigned int maxIndex, unsigned int myNum, unsigned int numWorkers, unsigned int& start, unsigned int& end)
78 {
79     int rangeSize = maxIndex / numWorkers;
80     start=myNum*rangeSize;
81     end=(myNum+1)*rangeSize;
82     if (myNum==numWorkers-1) end=maxIndex;
83
84 /*  // I don't understand what this is trying to do:
85     if(myNum < maxIndex % numWorkers)
86     {
87         start = myNum * (rangeSize + 1);
88         end = start + rangeSize;
89     }
90     else
91     {
92         start = myNum * rangeSize + maxIndex % numWorkers;
93         end = start + rangeSize - 1;
94     }
95 */
96 }
97
98 class TestArray : public CBase_TestArray
99 {
100 protected:
101     MSA2DRM arr1;       // row major
102
103     unsigned int rows1, cols1, numWorkers;
104
105     void FillArray(MSA2DRM::Write &w)
106     {
107         // fill in our portion of the array
108         unsigned int rowStart, rowEnd;
109         GetMyIndices(rows1, thisIndex, numWorkers, rowStart, rowEnd);
110
111         // fill them in with 1
112         for(unsigned int r = rowStart; r < rowEnd; r++)
113             for(unsigned int c = 0; c < cols1; c++)
114                 w.set(r, c) = 1.0;
115     }
116
117     void TestResults(MSA2DRM::Read &rh)
118     {
119         int errors = 0;
120
121         // verify the results
122         for(unsigned int r = 0; r < rows1; r++)
123         {
124             bool warnedRow=false;
125             for(unsigned int c = 0; c < cols1; c++)
126             {
127                 if((!warnedRow) && notequal(rh.get(r, c), 1.0))
128                 {
129                     ckout << "p" << CkMyPe() << "w" << thisIndex << " arr1 -- Illegal element at (" << r << "," << c << ") " << rh.get(r,c) << endl;
130                     errors++;
131                     warnedRow=true;
132                 }
133             }
134         }
135
136         if (errors) CkAbort("Incorrect array elements detected!");
137     }
138
139     void Contribute()
140     {
141         int dummy = 0;
142         contribute(sizeof(int), &dummy, CkReduction::max_int);
143     }
144
145 public:
146     TestArray(const MSA2DRM &arr_, unsigned int numWorkers_)
147     : arr1(arr_), rows1(arr1.getRows()), cols1(arr1.getCols()), numWorkers(numWorkers_)
148     {
149     }
150
151     TestArray(CkMigrateMessage* m) {}
152
153     ~TestArray()
154     {
155     }
156
157     // threaded EP
158     void Start()
159     {
160         arr1.enroll(numWorkers); // barrier
161                 MSA2DRM::Write w = arr1.getInitialWrite();
162         FillArray(w);
163                 MSA2DRM::Read r = w.syncToRead();
164         TestResults(r);  // test before doing a reduction
165         Contribute();
166     }
167
168     void Kontinue()
169     {
170 //        TestResults();
171         Contribute();
172     }
173 };
174
175 #include "t3.def.h"