Docs: refer to illinois.edu, not uiuc.edu
[charm.git] / doc / charm++ / helloworld.tex
1 \zap{
2 A simple \charmpp\ program is given below:
3
4 \begin{alltt}
5 ///////////////////////////////////////
6 // File: pgm.ci
7
8 mainmodule Hello \{
9   readonly CProxy_HelloMain mainProxy;
10   mainchare HelloMain \{
11     entry HelloMain(); // implicit CkArgMsg * as argument
12     entry void PrintDone(void);
13   \};
14   group HelloGroup \{
15     entry HelloGroup(void);
16   \};
17 \};
18
19 ////////////////////////////////////////
20 // File: pgm.h
21 #include "Hello.decl.h" // Note: not pgm.decl.h
22
23 class HelloMain : public CBase_HelloMain \{
24   public:
25     HelloMain(CkArgMsg *);
26     void PrintDone(void);
27   private:
28     int count;
29 \};
30
31 class HelloGroup: public Group \{
32   public:
33     HelloGroup(void);
34 \};
35
36 /////////////////////////////////////////
37 // File: pgm.C
38 #include "pgm.h"
39
40 CProxy_HelloMain mainProxy;
41
42 HelloMain::HelloMain(CkArgMsg *msg) \{
43   delete msg;
44   count = 0;
45   mainProxy = thisProxy;
46   CProxy_HelloGroup::ckNew(); // Create a new "HelloGroup"
47 \}
48
49 void HelloMain::PrintDone(void) \{
50   count++;
51   if (count == CkNumPes()) \{ // Wait for all group members to finish the printf
52     CkExit();
53   \}
54 \}
55
56 HelloGroup::HelloGroup(void) \{
57   ckout << "Hello World from processor " << CkMyPe() << endl;
58   mainProxy.PrintDone();
59 \}
60
61 #include "Hello.def.h" // Include the Charm++ object implementations
62
63 /////////////////////////////////////////
64 // File: Makefile
65
66 pgm: pgm.ci pgm.h pgm.C
67       charmc -c pgm.ci
68       charmc -c pgm.C
69       charmc -o pgm pgm.o -language charm++
70
71 \end{alltt}
72
73 \uw{HelloMain} is designated a \kw{mainchare}. Thus the Charm RTS starts
74 execution of this program by creating an instance of \uw{HelloMain} on
75 processor 0. The HelloMain constructor creates a chare group
76 \uw{HelloGroup}, and stores a handle to itself and returns. The call to
77 create the group returns immediately after directing Charm RTS to perform
78 the actual creation and invocation.  Shortly after, the Charm RTS will
79 create an object of type \uw{HelloGroup} on each processor, and call its
80 constructor. The constructor will then print ``Hello World...'' and then
81 call the \uw{PrintDone} method of \uw{HelloMain}. The \uw{PrintDone} method
82 calls \kw{CkExit} after all group members have called it (i.e., they have
83 finished printing ``Hello World...''), and the \charmpp program exits.
84
85 \subsection{Functions in the ``decl.h'' and ``def.h'' files}
86
87 The \texttt{decl.h} file provides declarations for the proxy classes of the
88 concurrent objects declared in the ``.ci'' file (from which the \texttt{decl.h}
89 file is generated). So the \uw{Hello.decl.h} file will have the declaration of
90 the class CProxy\_HelloMain. Similarly it will also have the declaration for
91 the HelloGroup class. 
92
93 This class will have functions to create new instances of the chares and
94 groups, like the function \kw{ckNew}. For \uw{HelloGroup} this function creates
95 an instance of the class \uw{HelloGroup} on all the processors. 
96
97 The proxy class also has functions corresponding to the entry methods defined
98 in the ``.ci'' file. In the above program the method wait is declared in
99 \uw{CProxy\_HelloMain} (proxy class for \uw{HelloMain}).
100
101 The proxy class also provides static registration functions used by the
102 \charmpp{} runtime.  The \texttt{def.h} file has a registration function
103 (\uw{\_\_registerHello} in the above program) which calls all the registration
104 functions corresponding to the readonly variables and entry methods declared in
105 the module.
106 } % end zap
107
108