msgQ: Use the datatype for msg prios as specified by user (CMK_MSG_PRIO_TYPE)
[charm.git] / doc / charisma / example.tex
1 \section{Example: Jacobi 1D}
2 Following is the content of the orchestration file jacobi.or. 
3
4 \begin{SaveVerbatim}{foodecl}
5 program jacobi
6
7 class  JacobiMain : MainChare;
8 class  JacobiWorker : ChareArray1D;
9 obj  workers : JacobiWorker[M];
10 param  lb : double[N];
11 param  rb : double[N];
12
13 begin
14     for iter = 1 to MAX_ITER
15         foreach i in workers
16             (lb[i], rb[i]) <- workers[i].produceBorders();
17             workers[i].compute(lb[i+1], rb[i-1]);
18         end-foreach
19     end-for
20 end
21 \end{SaveVerbatim}
22 \vspace{0.1in}
23 \smallfbox{\BUseVerbatim{foodecl}}
24 \vspace{0.1in}
25
26 The class {\tt JacobiMain} does not need any sequential code, so the only
27 sequential code are in JacobiWorker.h and JacobiWorker.C. Note that
28 JacobiWorker.h contains only the sequential portion of JacobiWorker's
29 declaration. 
30
31 \begin{SaveVerbatim}{foodecl}
32 #define N 512
33 #define M 16
34
35 int currentArray;       
36 double localData[2][M][N]; 
37 double localLB[N];
38 double localRB[N];
39 int myLeft,myRight,myUpper,myLower;
40
41 void initialize();
42 void compute(double lghost[], double rghost[]);
43 void produceBorders(outport lb,outport rb);
44 double abs(double d);
45 \end{SaveVerbatim}
46 \vspace{0.1in}
47 \smallfbox{\BUseVerbatim{foodecl}}
48 \vspace{0.1in}
49
50 Similarly, the sequential C code will be integrated into the generated C file.
51 Below is part of the sequential C code taken from JacobiWorker.C to show how
52 consumed parameters ({\tt rghost} and {\tt lghost} in {\tt
53 JacobiWorker::compute}) and produced parameters ({\tt lb} and {\tt rb} in {\tt
54 JacobiWorker::produceBorders}) are handled.
55
56 \begin{SaveVerbatim}{foodecl}
57 void JacobiWorker::compute(double rghost[], double lghost[]){
58     /* local computation for updating elements*/
59 }
60
61 void JacobiWorker::produceBorders(outport lb, outport rb){
62     produce(lb,localData[currentArray][myLeft],myLower-myUpper+1);
63     produce(rb,localData[currentArray][myRight],myLower-myUpper+1);
64 }
65 \end{SaveVerbatim}
66 \vspace{0.1in}
67 \smallfbox{\BUseVerbatim{foodecl}}
68 \vspace{0.1in}
69
70 The user compile these input files with the following command:
71
72 \begin{SaveVerbatim}{foodecl}
73   > orchc jacobi.or
74 \end{SaveVerbatim}
75 \vspace{0.1in}
76 \smallfbox{\BUseVerbatim{foodecl}}
77 \vspace{0.1in}
78
79 The compiler generates the parallel code for sending out messages, organizing
80 flow of control, and then it looks for sequential code files for the classes
81 declared, namely {\tt JacobiMain} and {\tt JacobiWorker}, and integrates them
82 into the final output: {\tt jacobi.h}, {\tt jacobi.C} and {\tt jacobi.ci}, which
83 is a Charm++ program and can be built the way a Charm++ program is built.
84