687ba4fd629cd4cefbd1d1c06560a6cd011e17e7
[charm.git] / tests / charm++ / load_balancing / lb_test / predictor / test.C
1 #include "test.h"
2
3 // routine that updates the length of the work done by the object
4 #define MYROUTINE(xxx)    xxx==4000 ? 1000 : 4000
5 //#define MYROUTINE(xxx)    xxx
6
7 #define MAX_ITER  40
8
9 Main::Main(CkArgMsg *m) { // entry point of the program
10
11   el = 12;
12   //if (m->argc > 1) el = atoi(m->argv[1]);
13   delete m;
14
15   mainhandle=thishandle;
16   called = 0;
17
18   CProxy_MyArray arr = CProxy_MyArray::ckNew(el);
19   arr.compute();
20 }
21
22 void Main::allDone() {
23   if (++called = el) {
24     CkExit();
25   }
26 }
27
28 MyArray::MyArray() {
29   length = 5000;
30   iterations = 0;
31   usesAtSync = true;
32   for (int i=0; i<length; ++i) {
33     data1[i] = rand();
34     data2[i] = rand();
35   }
36 }
37
38 void MyArray::compute() {
39   CkPrintf("[%d] computing iteration %d, length %d\n",thisIndex,++iterations,length);
40   for (int j=0; j<2000; ++j) {
41   for (int i=0; i<length; ++i) {
42     a[i] = data1[i] * data2[i];
43     b[i] = data1[i] / data2[i];
44   }
45   }
46   AtSync();
47 }
48
49 void MyArray::ResumeFromSync(void) {
50   length = MYROUTINE(length);
51
52   // exceptions for the Predictor
53   if (iterations == 1) LBTurnPredictorOff();
54   if (iterations == 3) LBTurnPredictorOn(0, 25);
55   if (iterations == 35) LBChangePredictor(new DefaultFunction());
56   if (iterations == 39) {
57     LBTurnPredictorOff();
58     LBTurnPredictorOn(0,15);
59   }
60
61   if (iterations < MAX_ITER) thisProxy[thisIndex].compute();
62   else mainhandle.allDone();
63 };
64
65 void MyArray::pup(PUP::er &p) {
66   p|length;
67   p|iterations;
68 }
69
70 #include "test.def.h"