Example charm++/matmul: generalize implementation body to varying sizes
[charm.git] / examples / bigsim / emulator / ring.C
1 #include <stdio.h>
2 #include "blue.h"
3
4 typedef struct {
5   char core[CmiBlueGeneMsgHeaderSizeBytes];
6   int data;
7 } RingMsg;
8
9 const int MAXITER = 1;
10 int passRingID;
11 int iter = 0;
12
13 void passRing(char *msg);
14
15 void nextxyz(int x, int y, int z, int *nx, int *ny, int *nz)
16 {
17   int sx, sy, sz;
18   BgGetSize(&sx, &sy, &sz);
19   *nz = z+1;  *ny = y; *nx = x;
20   if (*nz == sz) {
21     *nz = 0;
22     (*ny) ++;
23     if (*ny == sy) {
24       *ny = 0;
25       (*nx) ++;
26     }
27     if (*nx == sx) {
28       (*nx) = 0;
29     }
30   }
31 }
32
33 void BgEmulatorInit(int argc, char **argv)
34 {
35    if (argc < 6)     CmiAbort("Usage: <ring> <x> <y> <z> <numCommTh> <numWorkTh>\n");
36    BgSetSize(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
37    BgSetNumCommThread(atoi(argv[4]));        
38    BgSetNumWorkThread(atoi(argv[5]));
39 }
40
41 void BgNodeStart(int argc, char **argv)  {
42     int x,y,z, nx, ny, nz;  
43     RingMsg *msg = (RingMsg*) CmiAlloc(sizeof(RingMsg));
44     msg->data =  888;
45     passRingID = BgRegisterHandler(passRing);
46     BgGetMyXYZ(&x, &y, &z);           
47     nextxyz(x, y, z, &nx, &ny, &nz);
48     if (x == 0 && y==0 && z==0) {
49       printf("%d %d %d => %d %d %d\n", x,y,z,nx,ny,nz);
50       BgSendPacket(nx, ny, nz, ANYTHREAD, passRingID, LARGE_WORK, sizeof(RingMsg), (char *)msg);
51     }
52 }
53
54 void passRing(char *msg)  {
55      int x, y, z,  nx, ny, nz;
56      BgGetMyXYZ(&x, &y, &z);            
57      nextxyz(x, y, z, &nx, &ny, &nz);
58      printf("%d %d %d => %d %d %d\n", x,y,z,nx,ny,nz);
59      if (x==0 && y==0 && z==0)     if (++iter == MAXITER) { BgShutdown(); return; }
60      CmiAssert(((RingMsg*)msg)->data == 888);
61      BgSendPacket(nx, ny, nz, ANYTHREAD, passRingID, LARGE_WORK, sizeof(RingMsg), (char*)msg);
62 }
63