c37c71c36902209348039a3c4ec9d0eceeee7f93
[charm.git] / tests / converse / commbench / commbench.c
1  /**************************************************************************
2  * DESCRIPTION:
3  *
4  * To add a test to commbench, you have to:
5  *
6  *   1. write a testname_moduleinit function that initializes the module.
7  *   2. write a testname_init function that starts the test.
8  *   3. declare the testname_init function inside this module.
9  *   4. extend the tests[] table in this module to include the new test.
10  *
11  **************************************************************************/
12
13 #include <stdio.h>
14 #include <converse.h>
15 #include "commbench.h"
16
17 /******************************************************************************
18  *
19  * Test Configuration Section
20  *
21  *****************************************************************************/
22
23 extern void memoryAccess_init(void);
24 extern void overhead_init(void);
25 extern void timer_init(void);
26 extern void proc_init(void);
27 extern void smputil_init(void);
28 extern void pingpong_init(void);
29 extern void broadcast_init(void);
30 extern void reduction_init(void);
31 extern void ctxt_init(void);
32
33 extern void memoryAccess_moduleinit(void);
34 extern void overhead_moduleinit(void);
35 extern void timer_moduleinit(void);
36 extern void proc_moduleinit(void);
37 extern void smputil_moduleinit(void);
38 extern void pingpong_moduleinit(void);
39 extern void broadcast_moduleinit(void);
40 extern void reduction_moduleinit(void);
41 extern void ctxt_moduleinit(void);
42
43 struct testinfo
44 {
45   char *name;
46   void (*initiator)(void);
47   void (*initializer)(void);
48 } tests[] = {
49 //  { "memoryAccess",  memoryAccess_init,  memoryAccess_moduleinit },
50 //  { "overhead",  overhead_init,  overhead_moduleinit },
51 //  { "timer",     timer_init,     timer_moduleinit },
52 //  { "proc",      proc_init,      proc_moduleinit },
53 //  { "smputil",   smputil_init,   smputil_moduleinit },
54   { "pingpong",  pingpong_init,  pingpong_moduleinit },
55 //  { "broadcast", broadcast_init, broadcast_moduleinit },
56 //  { "reduction", reduction_init, reduction_moduleinit },
57 //  { "ctxt",      ctxt_init,      ctxt_moduleinit },
58   { 0,0,0 },
59 };
60
61 /******************************************************************************
62  *
63  * Central Control Section
64  *
65  *****************************************************************************/
66
67 CpvStaticDeclare(int, test_bank_size);
68 CpvStaticDeclare(int, test_negate_skip);
69 CpvStaticDeclare(char **, tests_to_skip);
70 CpvStaticDeclare(int, num_tests_to_skip);
71 CpvStaticDeclare(int, next_test_index);
72 CpvStaticDeclare(int, shutdown_handler);
73 CpvDeclare(int, ack_handler);
74
75 void commbench_shutdown(void *msg)
76 {
77   CmiFree(msg);
78   CsdExitScheduler();
79 }
80
81 int commbench_skip(char *test)
82 {
83   int i;
84   int num_skip = CpvAccess(num_tests_to_skip);
85   char **skip;
86   /* default mode where no tests are skipped */
87   if(num_skip==0) return 0;
88
89   skip = CpvAccess(tests_to_skip);
90   for (i=0; i<num_skip; i++) {
91     if (strcmp(skip[i+2], test)==0)
92       return 0; 
93   }
94   return 1;
95 }
96
97 void commbench_next()
98 {
99   int idx, bank;
100   EmptyMsg msg;
101
102   bank = CpvAccess(test_bank_size);
103 nextidx:
104   idx = CpvAccess(next_test_index);
105   if (idx < bank) {
106     if (commbench_skip(tests[idx].name)) {
107       CpvAccess(next_test_index)++;
108       goto nextidx;
109     }
110     CmiPrintf("[%s] initiated\n", tests[idx].name);
111     (tests[idx].initiator)();
112     return; 
113   }
114   if (idx==bank) {
115     CmiPrintf("All benchmarks completed, exiting...\n");
116     CmiSetHandler(&msg, CpvAccess(shutdown_handler));
117     CmiSyncBroadcastAll(sizeof(EmptyMsg), &msg);
118     return;
119   }
120 }
121
122 void commbench_ack(void *msg)
123 {
124   CmiFree(msg);
125   CpvAccess(next_test_index)++;
126   commbench_next();
127 }
128
129 void commbench_init(int argc, char **argv)
130 {
131   int numtests, i;
132   CpvInitialize(int, shutdown_handler);
133   CpvInitialize(int, ack_handler);
134   CpvAccess(shutdown_handler) = CmiRegisterHandler((CmiHandler)commbench_shutdown);
135   CpvAccess(ack_handler) = CmiRegisterHandler((CmiHandler)commbench_ack);
136   for (i=0; (tests[i].initializer); i++)
137     (tests[i].initializer)();
138   CpvInitialize(int, test_bank_size);
139   CpvInitialize(int, test_negate_skip);
140   CpvInitialize(int, num_tests_to_skip);
141   CpvInitialize(char **, tests_to_skip);
142   CpvInitialize(int, next_test_index);
143   for (numtests=0; tests[numtests].name; numtests++);
144   CpvAccess(test_bank_size) = numtests;
145   CpvAccess(next_test_index) = 0;
146   CpvAccess(test_negate_skip)=0;
147   for (i=1; i<argc; i++)
148     if (strcmp(argv[i],"-only")==0)
149       CpvAccess(test_negate_skip)=1;
150   CpvAccess(num_tests_to_skip) = 0;
151   if(CpvAccess(test_negate_skip)) {
152     CpvAccess(num_tests_to_skip) = argc-2;
153   }
154   CpvAccess(tests_to_skip) = argv;
155
156   if (CmiMyPe()==0)
157     commbench_next();
158 }
159
160 int main(int argc, char **argv)
161 {
162   ConverseInit(argc,argv,commbench_init,0,0);
163 }