msgQ test: Adjust test parameters (num priorities, numiters)
[charm.git] / tests / charm++ / pmetest / testpme.C
1
2 #include "charm++.h"
3 #include "pencilfft/pencil_api.h"
4 #include "patch.h"
5
6 #define MAX_ITERATIONS 100
7
8 LineFFTInfo   info;
9 PatchInfo     patchInfo;
10
11 int           iteration;
12 double        startTime;
13
14 CProxy_Patch  patch_proxy;
15
16 class main : public CBase_main {
17 public:
18   main (CkArgMsg *m);
19   main (CkMigrateMessage *m) {}
20   
21   void iterationsDone (CkReductionMsg *msg) {
22     double endTime = CmiWallTimer();    
23     CkPrintf ("PME Time to perform a pair of (%d, %d, %d) 3D FFT operations %g ms\n", 
24               info.sizeX, info.sizeY, info.sizeZ,
25               (endTime - startTime) * 1000.0/ (MAX_ITERATIONS));
26     CkExit ();  
27   }
28   
29   void finishedInitialization (CkReductionMsg *msg) {    
30     int *gmsgcounts = (int *) msg->getData();
31     int size  = msg->getSize () / sizeof(int);
32     
33     int ny = info.sizeY / info.grainY;
34     int nz = info.sizeZ / info.grainZ;    
35     
36     CkAssert (size == ny * nz);    
37    
38     CkCallback cb(CkIndex_main::finishedSetNumGrid (NULL), 
39                   CProxy_main(ckGetChareID()));
40  
41     for (int z = 0; z < nz; z ++)
42       for (int y = 0; y < ny; y ++) {
43 #if __TEST_PME_VERBOSE__       
44         CkPrintf ("Finished intialization nmsgs[%d,%d] = %d", z,y, 
45                   gmsgcounts [z *ny + y]);
46 #endif
47         info.xProxy (y,z).setNumGridMessages(gmsgcounts[z * ny + y], cb);
48       }
49   }
50   
51   void finishedSetNumGrid (CkReductionMsg *msg) {
52 #if __TEST_PME_VERBOSE__       
53     CkPrintf ("Finished SetNumGrid Reduction\n");
54 #endif
55
56     startTime = CmiWallTimer ();
57     patch_proxy.startTimeStep ();
58   }
59 };
60
61 main::main (CkArgMsg *m) {
62   int sizeX=0, sizeY=0, sizeZ=0;
63   int grainX=0, grainY=0, grainZ=0;
64   int patch_nx=0, patch_ny=0, patch_nz=0;
65
66   CkAssert (CkNumPes() > 1); //test needs a power of two processors > 1
67
68   if (m->argc <= 1) {
69     if (CkNumPes () <= 64) {
70       sizeX = sizeY = sizeZ = 16;
71       grainX = grainY = grainZ = 4;
72       patch_nx = 2;
73     }
74     else {
75       sizeX = sizeY = sizeZ = 128;
76       grainX = grainY = grainZ = 8;
77       patch_nx = 8;
78     }
79   }
80   else {
81     CkAssert (m->argc == 4);
82     sizeX = sizeY = sizeZ = atoi (m->argv[1]);
83     grainX = grainY = grainZ = atoi (m->argv[2]);    
84     patch_nx = atoi (m->argv[3]);
85
86     CkAssert ((sizeX % grainX) == 0);
87   }
88
89   CkAssert ((CkNumPes() & (CkNumPes() - 1)) == 0); //must run on power of 2
90
91   if (CkNumPes () >= 8 * patch_nx * patch_nx) {
92     patch_ny = patch_nx;
93     patch_nz = (CkNumPes()) / (patch_nx * patch_nx);
94   }
95   else {
96     if (patch_nx >= CkNumPes())
97       patch_ny = patch_nx/2;
98     else
99       patch_ny = patch_nx;
100
101     patch_nz = CkNumPes() / (patch_nx * patch_ny);
102   }
103     
104   CkAssert (patch_nx * patch_ny * patch_nz == CkNumPes());
105
106   CkPrintf ("PME TEST: Calling Configure\n");
107   configureLineFFTInfo (&info, sizeX, sizeY, sizeZ, 
108                         grainX, grainY, grainZ,
109                         NULL, SEND_GRID, true);
110
111   CkPrintf ("PME Test: Calling CreateLineFFTArray\n");
112   createLineFFTArray (&info);
113   
114   patchInfo.nx = patch_nx;
115   patchInfo.ny = patch_ny;
116   patchInfo.nz = patch_nz;  
117   patchInfo.fftinfo = info;
118   patchInfo.niterations = MAX_ITERATIONS;
119
120   CkCallback cb_start(CkIndex_main::finishedInitialization (NULL), 
121                       CProxy_main (ckGetChareID()));
122   CkCallback cb_done (CkIndex_main::iterationsDone (NULL), 
123                       CProxy_main (ckGetChareID()));
124
125   patchInfo.cb_start = cb_start;
126   patchInfo.cb_done  = cb_done;
127
128   patch_proxy = CProxy_Patch::ckNew();
129
130   for (int z = 0; z < patch_nz; z ++) 
131     for (int y = 0; y < patch_ny; y ++) 
132       for (int x = 0; x < patch_nx; x ++) {
133         patchInfo.my_x = x;
134         patchInfo.my_y = y;
135         patchInfo.my_z = z;
136         
137         int idx = z * patch_nx * patch_ny + y * patch_nx + x;
138
139         patch_proxy[idx].initialize (patchInfo);
140       }
141
142   delete m;
143 };
144
145
146 #include "testpme.def.h"