updated CUDA hybridAPI and added a CUDA hello example
[charm.git] / examples / charm++ / cuda / hello / hello.C
1 #include <stdio.h>
2 #include "hello.decl.h"
3
4 /*readonly*/ CProxy_Main mainProxy;
5 /*readonly*/ int nElements;
6 /*readonly*/ CProxy_Hello arr; 
7
8 int currentIndex; 
9
10 extern void kernelSetup(); 
11
12 void kernelReturn() {
13   printf("Kernel returned\n"); 
14   arr[currentIndex].SendHi(); 
15   //  sendHi(); 
16 }
17
18 /*mainchare*/
19 class Main : public CBase_Main
20 {
21 public:
22   Main(CkArgMsg* m)
23   {
24     //Process command-line arguments
25     nElements=5;
26     if(m->argc >1 ) nElements=atoi(m->argv[1]);
27     delete m;
28
29     //Start the computation
30     CkPrintf("Running Hello on %d processors for %d elements\n",
31              CkNumPes(),nElements);
32     mainProxy = thisProxy;
33
34     arr = CProxy_Hello::ckNew(nElements);
35
36     currentIndex = 0; 
37
38     arr[0].SayHi();
39   };
40
41   void done(void)
42   {
43     CkPrintf("All done\n");
44     CkExit();
45   };
46 };
47
48 /*array [1D]*/
49 class Hello : public CBase_Hello
50 {
51 public:
52   Hello()
53   {
54     CkPrintf("Hello %d created\n",thisIndex);
55   }
56
57   Hello(CkMigrateMessage *m) {}
58
59   void SayHi()
60   {
61     currentIndex = thisIndex; 
62     CkPrintf("Hi from element %d\n", thisIndex);
63     if (thisIndex < nElements-1)
64       kernelSetup(); 
65     else 
66       //We've been around once-- we're done.
67       mainProxy.done();
68   }
69
70   void SendHi() {
71     //Pass the hello on:
72     CkPrintf("Executing sendHi\n"); 
73     thisProxy[thisIndex+1].SayHi();
74   }
75
76 };
77
78 #include "hello.def.h"