Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / charm++ / pupDisk / pupDisk.h
1 //////////////////////////////////////
2 //
3 //  pupDisk.h  
4 //
5 //  Declaration of chares in pupDisk
6 //
7 //  Author: Eric Bohm
8 //  Date: 2012/01/23
9 //
10 //////////////////////////////////////
11
12 #include "pupDisk.decl.h"
13 #include <map>
14 #include "pup_stl.h"
15 class main : public CBase_main {
16 public:
17   main(CkMigrateMessage *m) {}
18   main(CkArgMsg *m);
19   void done(CkReductionMsg *m){
20     CkPrintf("done\n");
21     CkExit();
22   }
23   void initialized(CkReductionMsg *m);
24   void written(CkReductionMsg *m);
25   void read(CkReductionMsg *m);
26
27 };
28
29 class pupDiskMap: public CkArrayMap
30 {
31  public:
32   int maxFiles;
33  pupDiskMap(int _maxFiles):maxFiles(_maxFiles) {}
34   inline int procNum(int, const CkArrayIndex &iIndex)
35   {
36     int *index=(int *) iIndex.data();
37     int proc;
38     if(CmiCpuTopologyEnabled())
39       { // use physnode API
40         if(CmiNumPhysicalNodes() > maxFiles)
41           {
42             proc=CmiGetFirstPeOnPhysicalNode(index[0]);
43           }
44         else
45           { 
46             //cleverness could be tried, but we really don't care because you 
47             //want more files than is good for you.
48             proc=index[0]%CmiNumPes();
49           }
50       }
51     else
52       {
53         if(CmiNumNodes()>maxFiles)
54           {// 
55             proc=index[0]*CmiMyNodeSize();
56           }
57         else if (CmiNumPes()>maxFiles)
58           { //simple round robin because we don't really care
59             proc=index[0];
60           }
61         else //there is no good mapping
62           {
63             proc=index[0]%CkNumPes();
64           }
65       }
66     return proc;
67   }
68   
69 };
70
71 class userData : public CBase_userData {
72 public:
73   userData(CkMigrateMessage *m) {}
74  userData(int _howbig, int _numElements, int _maxFiles): howBig(_howbig), numElements(_numElements), maxFiles(_maxFiles){ myData=new someData(howBig);}
75   ~userData(){ if(myData) delete myData;}
76   void init();
77   void read();
78   void write();
79   void writeDone();
80   void verify();
81   void acceptData(someData &inData);
82  private:
83   someData *myData;
84   int howBig;
85   int numElements;
86   int maxFiles;
87 };
88
89 class pupDisk : public CBase_pupDisk {
90 public:
91   pupDisk(CkMigrateMessage *m) {}
92   pupDisk(int _howbig, int _numElements, int _maxFiles);
93   ~pupDisk(){ ;}
94   void read(int sender);
95   void write(int sender, someData &data);
96   void diskWrite();
97   bool diskRead(int sender);
98  private:
99   someData *dataCache;
100   bool doneRead;
101   int count;
102   int howBig;
103   int numElements;
104   int maxFiles;
105   int elementsToWrite;
106   std::map<int, int> lookupIdx;
107   int nextSlot;
108 };