adding a new test to commbench
[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 ctxt_init(void);
30
31 extern void memoryAccess_moduleinit(void);
32 extern void overhead_moduleinit(void);
33 extern void timer_moduleinit(void);
34 extern void proc_moduleinit(void);
35 extern void smputil_moduleinit(void);
36 extern void pingpong_moduleinit(void);
37 extern void ctxt_moduleinit(void);
38
39 struct testinfo
40 {
41   char *name;
42   void (*initiator)(void);
43   void (*initializer)(void);
44 } tests[] = {
45   { "memoryAccess",  memoryAccess_init,  memoryAccess_moduleinit },
46   { "overhead",  overhead_init,  overhead_moduleinit },
47   { "timer",     timer_init,     timer_moduleinit },
48   { "proc",      proc_init,      proc_moduleinit },
49   { "smputil",   smputil_init,   smputil_moduleinit },
50   { "pingpong",  pingpong_init,  pingpong_moduleinit },
51   { "ctxt",      ctxt_init,      ctxt_moduleinit },
52   { 0,0,0 },
53 };
54
55 /******************************************************************************
56  *
57  * Central Control Section
58  *
59  *****************************************************************************/
60
61 CpvStaticDeclare(int, test_bank_size);
62 CpvStaticDeclare(int, test_negate_skip);
63 CpvStaticDeclare(char **, tests_to_skip);
64 CpvStaticDeclare(int, num_tests_to_skip);
65 CpvStaticDeclare(int, next_test_index);
66 CpvStaticDeclare(int, shutdown_handler);
67 CpvDeclare(int, ack_handler);
68
69 void commbench_shutdown(void *msg)
70 {
71   CmiFree(msg);
72   CsdExitScheduler();
73 }
74
75 int commbench_skip(char *test)
76 {
77   int i;
78   int num_skip = CpvAccess(num_tests_to_skip);
79   char **skip;
80   /* default mode where no tests are skipped */
81   if(num_skip==0) return 0;
82
83   skip = CpvAccess(tests_to_skip);
84   for (i=0; i<num_skip; i++) {
85     if (strcmp(skip[i+2], test)==0)
86       return 0; 
87   }
88   return 1;
89 }
90
91 void commbench_next()
92 {
93   int idx, bank;
94   EmptyMsg msg;
95
96   bank = CpvAccess(test_bank_size);
97 nextidx:
98   idx = CpvAccess(next_test_index);
99   if (idx < bank) {
100     if (commbench_skip(tests[idx].name)) {
101       CpvAccess(next_test_index)++;
102       goto nextidx;
103     }
104     CmiPrintf("[%s] initiated\n", tests[idx].name);
105     (tests[idx].initiator)();
106     return; 
107   }
108   if (idx==bank) {
109     CmiPrintf("All benchmarks completed, exiting...\n");
110     CmiSetHandler(&msg, CpvAccess(shutdown_handler));
111     CmiSyncBroadcastAll(sizeof(EmptyMsg), &msg);
112     return;
113   }
114 }
115
116 void commbench_ack(void *msg)
117 {
118   CmiFree(msg);
119   CpvAccess(next_test_index)++;
120   commbench_next();
121 }
122
123 void commbench_init(int argc, char **argv)
124 {
125   int numtests, i;
126   CpvInitialize(int, shutdown_handler);
127   CpvInitialize(int, ack_handler);
128   CpvAccess(shutdown_handler) = CmiRegisterHandler((CmiHandler)commbench_shutdown);
129   CpvAccess(ack_handler) = CmiRegisterHandler((CmiHandler)commbench_ack);
130   for (i=0; (tests[i].initializer); i++)
131     (tests[i].initializer)();
132   CpvInitialize(int, test_bank_size);
133   CpvInitialize(int, test_negate_skip);
134   CpvInitialize(int, num_tests_to_skip);
135   CpvInitialize(char **, tests_to_skip);
136   CpvInitialize(int, next_test_index);
137   for (numtests=0; tests[numtests].name; numtests++);
138   CpvAccess(test_bank_size) = numtests;
139   CpvAccess(next_test_index) = 0;
140   CpvAccess(test_negate_skip)=0;
141   for (i=1; i<argc; i++)
142     if (strcmp(argv[i],"-only")==0)
143       CpvAccess(test_negate_skip)=1;
144   CpvAccess(num_tests_to_skip) = 0;
145   if(CpvAccess(test_negate_skip)) {
146     CpvAccess(num_tests_to_skip) = argc-2;
147   }
148   CpvAccess(tests_to_skip) = argv;
149
150   if (CmiMyPe()==0)
151     commbench_next();
152 }
153
154 int main(int argc, char **argv)
155 {
156   ConverseInit(argc,argv,commbench_init,0,0);
157 }