Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / pose / PatternGen / pgm.C
1 #include "pose.h"
2 #include "pgm.h"
3 #include "Pgm.def.h"
4 #include "Worker_sim.h"
5
6 main::main(CkArgMsg *m) { 
7   CkGetChareID(&mainhandle);
8
9   int numWorkers, patternNum;
10
11   if ((m->argc < 3) || (strcmp(m->argv[1], "-help") == 0)) {
12     CkPrintf("\nUsage: pgm <#workerObjs> <pattern#> [<pattern parameters>]\n");
13     CkPrintf("\n");
14     CkPrintf("Pattern 0: Simple ring test\n");
15     CkPrintf("   Pattern parameters: none\n");
16     CkPrintf("Pattern 1: Short communcation bursts (~100 GVT ticks apart), long message send (~1M ticks), repeat\n");
17     CkPrintf("   Pattern parameters: none\n");
18     CkPrintf("Pattern 2: Simultaneous ring with elapse statements\n");
19     CkPrintf("   Pattern parameters: none\n");
20     CkPrintf("Pattern 3: Simultaneous ring without elapse statements\n");
21     CkPrintf("   Pattern parameters: none\n");
22     CkPrintf("\n");
23     CkPrintf("For more details on the patterns, see the README file.\n\n");
24     CkExit();
25   }
26
27   numWorkers = atoi(m->argv[1]);
28   if (numWorkers < 1) {
29     CkPrintf("Number of Worker objects (%d) must be positive\n", numWorkers);
30     CkExit();
31   }
32
33   patternNum = atoi(m->argv[2]);
34   if ((patternNum < 0) || (patternNum >= NUM_AVAILABLE_PATTERNS)) {
35     CkPrintf("Invalid pattern number: %d\n", patternNum);
36     CkPrintf("Options: 0-%d\n", NUM_AVAILABLE_PATTERNS - 1);
37     CkExit();
38   }
39
40   CkPrintf("Pattern %d selected with %d Worker objects spread across %d PE(s)\n", patternNum, numWorkers, CkNumPes());
41
42   POSE_init();
43
44   int mappedPE;
45   WorkerInitMsg *initMsg;
46   for (int workerNum = 0; workerNum < numWorkers; workerNum++) {
47     initMsg = new WorkerInitMsg(workerNum, numWorkers, patternNum);
48     initMsg->Timestamp(0);
49     mappedPE = workerNum % CkNumPes();
50     dbPrintf("Placing Worker %d on PE %d\n", workerNum, mappedPE);
51     (*(CProxy_Worker *) &POSE_Objects)[workerNum].insert(initMsg, mappedPE);
52   }
53   POSE_Objects.doneInserting();
54 }