changes to make smp restart work
[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[2]);
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               <<g_prefetch<<TAB
68                           << end_time - start_time
69               << endl;
70         } else {
71
72             CkExit();
73         }
74     }
75 };
76
77
78 void GetMyIndices(unsigned int maxIndex, unsigned int myNum, unsigned int numWorkers, unsigned int& start, unsigned int& end)
79 {
80     int rangeSize = maxIndex / numWorkers;
81     start=myNum*rangeSize;
82     end=(myNum+1)*rangeSize;
83     if (myNum==numWorkers-1) end=maxIndex;
84
85 /*  // I don't understand what this is trying to do:
86     if(myNum < maxIndex % numWorkers)
87     {
88         start = myNum * (rangeSize + 1);
89         end = start + rangeSize;
90     }
91     else
92     {
93         start = myNum * rangeSize + maxIndex % numWorkers;
94         end = start + rangeSize - 1;
95     }
96 */
97 }
98
99 class TestArray : public CBase_TestArray
100 {
101 protected:
102     MSA2DRM arr1;       // row major
103
104     unsigned int rows1, cols1, numWorkers;
105
106     void FillArray(MSA2DRM::Write &w)
107     {
108         // fill in our portion of the array
109         unsigned int rowStart, rowEnd;
110         GetMyIndices(rows1, thisIndex, numWorkers, rowStart, rowEnd);
111
112         // fill them in with 1
113         for(unsigned int r = rowStart; r < rowEnd; r++)
114             for(unsigned int c = 0; c < cols1; c++)
115                 w.set(r, c) = 1.0;
116     }
117
118     void TestResults(MSA2DRM::Read &rh)
119     {
120         int errors = 0;
121
122         // verify the results
123         for(unsigned int r = 0; r < rows1; r++)
124         {
125             bool warnedRow=false;
126             for(unsigned int c = 0; c < cols1; c++)
127             {
128                 if((!warnedRow) && notequal(rh.get(r, c), 1.0))
129                 {
130                     ckout << "p" << CkMyPe() << "w" << thisIndex << " arr1 -- Illegal element at (" << r << "," << c << ") " << rh.get(r,c) << endl;
131                     errors++;
132                     warnedRow=true;
133                 }
134             }
135         }
136
137         if (errors) CkAbort("Incorrect array elements detected!");
138     }
139
140     void Contribute()
141     {
142         int dummy = 0;
143         contribute(sizeof(int), &dummy, CkReduction::max_int);
144     }
145
146 public:
147     TestArray(const MSA2DRM &arr_, unsigned int numWorkers_)
148     : arr1(arr_), rows1(arr1.getRows()), cols1(arr1.getCols()), numWorkers(numWorkers_)
149     {
150     }
151
152     TestArray(CkMigrateMessage* m) {}
153
154     ~TestArray()
155     {
156     }
157
158     // threaded EP
159     void Start()
160     {
161         arr1.enroll(numWorkers); // barrier
162                 MSA2DRM::Write w = arr1.getInitialWrite();
163         FillArray(w);
164                 MSA2DRM::Read r = w.syncToRead();
165         TestResults(r);  // test before doing a reduction
166         Contribute();
167     }
168
169     void Kontinue()
170     {
171 //        TestResults();
172         Contribute();
173     }
174 };
175
176 #include "t3.def.h"