examples: add example program demonstrating sync entry methods
[charm.git] / examples / charm++ / matmul / matmul.C
1 #include <cblas.h>
2 #include "matmul.decl.h"
3
4 CProxy_Main mainProxy;
5
6 class Main : public CBase_Main {
7   double startTime;
8   unsigned int blockSize, numBlocks;
9   CProxy_Block a, b, c;
10 public:
11   Main(CkArgMsg* m) {
12     if (m->argc > 2) {
13       blockSize = atoi(m->argv[1]);
14       numBlocks = atoi(m->argv[2]);
15     } else {
16       CkAbort("Usage: matmul blockSize numBlocks");
17     }
18
19     mainProxy = thisProxy;
20
21     a = CProxy_Block::ckNew(blockSize, numBlocks, numBlocks, numBlocks);
22     b = CProxy_Block::ckNew(blockSize, numBlocks, numBlocks, numBlocks);
23     c = CProxy_Block::ckNew(blockSize, numBlocks, numBlocks, numBlocks);
24
25     startTime = CkWallTimer();
26
27     a.pdgemmSendInput(c, true);
28     b.pdgemmSendInput(c, false);
29     c.pdgemmRun(1.0, 0.0, CkCallback(CkReductionTarget(Main, done), thisProxy));
30   }
31
32   void done() {
33     double endTime = CkWallTimer();
34     CkPrintf("Matrix multiply of %u blocks with %u elements each (%u^2) finished in %f seconds\n",
35              numBlocks, blockSize, numBlocks*blockSize, endTime - startTime);
36     CkExit();
37   }
38 };
39
40 class Block : public CBase_Block {
41   unsigned int blockSize, numBlocks, block;
42   double* data;
43   Block_SDAG_CODE
44   public:
45   Block(unsigned int blockSize_, unsigned int numBlocks_)
46     : blockSize(blockSize_), numBlocks(numBlocks_)
47   {
48     __sdag_init();
49     unsigned int elems = blockSize * blockSize;
50     data = new double[elems];
51     for (int i = 0; i < elems; ++i)
52       data[i] = drand48();
53   }
54
55   Block(CkMigrateMessage*) {}
56 };
57
58 #include "matmul.def.h"