/[MITgcm]/manual/s_autodiff/text/diva_revised_recipe_3.tex
ViewVC logotype

Annotation of /manual/s_autodiff/text/diva_revised_recipe_3.tex

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download) (as text)
Sat Mar 8 08:09:22 2003 UTC (22 years, 4 months ago) by heimbach
Branch: MAIN
File MIME type: application/x-tex
Adding section on DIVA to manual.
Subject to change.

1 heimbach 1.1
2     \section{Adjoint dump \& restart -- divided adjoint (DIVA)
3     \label{sec_ad_diva}}
4    
5     {\it Patrick Heimbach \& Geoffrey Gebbie, MIT/EAPS, 07-Mar-2003}
6    
7     {\bf
8     NOTE: \\
9     THIS SECTION IS SUBJECT TO CHANGE.
10     IT REFERS TO TAF-1.4.26.
11    
12     Previous TAF versions are incomplete and have problems
13     with both TAF options '-pure' and '-mpi'.
14    
15     The code which is tuned to the DIVA implementation
16     of this TAF version
17     is {\it checkpoint50} (MITgcm) and {\it ecco\_c50\_e28} (ECCO).
18     }
19    
20     \subsection{Introduction}
21    
22     Most high performance computing (HPC) centres require the use
23     of batch jobs for code execution.
24     Limits in maximum available CPU time and memory may prevent
25     the adjoint code execution from fitting into any of the available
26     queues. This presents a serious limit for large scale /
27     long time adjoint ocean and climate model integrations.
28     The MITgcm itself enables the split of the total model
29     integration into sub-intervals through standard dump/restart
30     of/from the full model state.
31     For a similar procedure to run in reverse mode,
32     the adjoint model requires, in addition to the model state,
33     the adjoint model state,
34     i.e. all variables with derivative information
35     which are needed in an adjoint restart.
36     This adjoint dump \& restart is also termed 'divided adjoint (DIVA).
37    
38     For this to work in conjunction with automatic differentiation,
39     an AD tool needs to perform the following tasks:
40     %
41     \begin{enumerate}
42     %
43     \item
44     %
45     identify an adjoint state, i.e. those sensitivities whose
46     accumulation is interrupted by a dump/restart and which influence
47     the outcome of the gradient.
48     Ideally, this state consists of
49     %
50     \begin{itemize}
51     %
52     \item
53     the adjoint of the model state,
54     %
55     \item
56     the adjoint of other intermediate results (such as control variables,
57     cost function contributions, etc.)
58     %
59     \item
60     bookkeeping indices (such as loop indices, etc.)
61     %
62     \end{itemize}
63     %
64     \item
65     %
66     generate code for storing and reading adjoint state variables
67     %
68     \item
69     generate code for bookkeeping , i.e. maintaining a file
70     with index information
71     %
72     \item
73     generate a suitable adjoint loop to propagate adjoint values
74     for dump/restart with a minimum overhad of adjoint intermediate
75     values.
76     %
77     \end{enumerate}
78    
79     TAF (but not TAMC!)
80     generates adjoint code which performs the above specified
81     tasks. It is closely tied to the adjoint multi-level checkpointing.
82     The adjoint state is dumped (and restarted) at each step of the
83     outermost checkpointing level and adjoint intergration is performed
84     over one outermost checkpointing interval.
85     Prior to the adjoint computations, a full foward sweep is performed to
86     generate the outermost (forward state) tapes and to calculate
87     the cost function.
88     In the current implementation, the forward sweep is
89     immediately followed by the first adjoint leg.
90     Thus, in theory, the following steps are performed (automatically)
91     %
92     \begin{itemize}
93     %
94     \item {\bf 1st model call:} \\
95     This is the case if file {\tt costfinal} does {\it not} exist.
96     S/R {\tt mdthe\_main\_loop} is called.
97     %
98     \begin{enumerate}
99     %
100     \item
101     calculate forward trajectory and dump model state after each
102     outermost checkpointing interval to files {\tt tapelev3}
103     %
104     \item
105     calculate cost function {\tt fc} and write it to file
106     {\tt costfinal}
107     %
108     \end{enumerate}
109     %
110     \item{\bf 2nd and all remaining model call:} \\
111     This is the case if file {\tt costfinal} {\it does} exist.
112     S/R {\tt adthe\_main\_loop} is called.
113     %
114     \begin{enumerate}
115     %
116     \item
117     (forward run and cost function call is avoided
118     since all values are known)
119     %
120     \begin{itemize}
121     %
122     \item
123     if 1st adjoint leg: \\
124     create index file {\tt divided.ctrl} which contains
125     info on current checkpointing index $ilev3$
126     %
127     \item
128     if not $i$-th adjoint leg: \\
129     adjoint picks up at $ilev3 = nlev3-i+1$ and runs to $nlev3 - i$
130     %
131     \end{itemize}
132     %
133     \item
134     perform adjoint leg from $nlev3-i+1$ to $nlev3 - i$
135     %
136     \item
137     dump adjoint state to file {\tt snapshot}
138     %
139     \item
140     dump index file {\tt divided.ctrl} for next adjoint leg
141     %
142     \item
143     in the last step the gradient is written.
144     %
145     \end{enumerate}
146     %
147     \end{itemize}
148    
149     A few modififications were performed in the forward code,
150     obvious ones such as adding the corresponding TAF-directive
151     at the appropriate place, and less obvious ones
152     (avoid some re-initializations, when in an intermediate
153     adjoint integration interval).
154    
155     [For TAF-1.4.20 a number of hand-modifications were necessary
156     to compensate for TAF bugs.
157     Since we refer to TAF-1.4.26 onwards,
158     these modifications are not documented here].
159    
160     \subsection{Recipe 1: single processor}
161    
162    
163     \begin{enumerate}
164    
165     \item
166     In {\tt ECCO\_CPPOPTIONS.h} set:
167     %
168     {\footnotesize
169     \begin{verbatim}
170     #define ALLOW_DIVIDED_ADJOINT
171     #undef ALLOW_DIVIDED_ADJOINT_MPI
172     \end{verbatim}
173     }
174    
175     \item
176     Generate adjoint code.
177     Using the TAF option '{\tt -pure}', two codes are generated:
178     %
179     \begin{itemize}
180     %
181     \item {\tt mdthe\_main\_loop}: \\
182     Is responsible for the forward trajectory, storing of outermost
183     checkpoint levels to file, computation of cost function, and
184     storing of cost function to file (1st step).
185     %
186     \item {\tt adthe\_main\_loop}: \\
187     Is responsible for computing one adjoint leg, dump adjoint state
188     to file and write index info to file (2nd and consecutive steps).
189    
190     for adjoint code generation, e.g. add '{\tt -pure}' to
191     TAF option list
192     {\footnotesize
193     \begin{verbatim}
194     make adtaf
195     \end{verbatim}
196     }
197     %
198    
199     \item
200     One modification needs to be made to adjoint codes in
201     S/R adecco\_the\_main\_loop:
202    
203     There's a remaining issue with the '{\tt -pure}' option.
204     The '{\tt call ad...}'
205     between '{\tt call ad...}' and the read of the {\tt snapshot} file
206     should be called only in the firt adjoint leg between
207     $nlev3$ and $nlev3-1$.
208     In the ecco-branch, the following lines should be
209     bracketed by an {\tt if (idivbeg .GE. nchklev\_3) then}, thus:
210    
211     {\footnotesize
212     \begin{verbatim}
213    
214     ...
215     xx_psbar_mean_dummy = onetape_xx_psbar_mean_dummy_3h(1)
216     xx_tbar_mean_dummy = onetape_xx_tbar_mean_dummy_4h(1)
217     xx_sbar_mean_dummy = onetape_xx_sbar_mean_dummy_5h(1)
218     call barrier( mythid )
219     cAdd(
220     if (idivbeg .GE. nchklev_3) then
221     cAdd)
222    
223     call adcost_final( mythid )
224     call barrier( mythid )
225     call adcost_sst( mythid )
226     call adcost_ssh( mythid )
227     call adcost_hyd( mythid )
228     call adcost_averagesfields( mytime,myiter,mythid )
229     call barrier( mythid )
230     cAdd(
231     endif
232     cAdd)
233    
234     C----------------------------------------------
235     C read snapshot
236     C----------------------------------------------
237     if (idivbeg .lt. nchklev_3) then
238     open(unit=77,file='snapshot',status='old',form='unformatted',
239     $iostat=iers)
240     ...
241    
242     \end{verbatim}
243     }
244    
245     For the main code, in all likelihood the block which needs to
246     be bracketed consists of {\tt adcost\_final} only.
247    
248     \item
249     Now the code can be copied as usual to {\tt adjoint\_model.F}
250     and then be compiled:
251     %
252     {\footnotesize
253     \begin{verbatim}
254     make adchange
255     then compile
256     \end{verbatim}
257     }
258    
259     \end{itemize}
260    
261     \end{enumerate}
262    
263     \subsection{Recipe 2: multi processor (MPI)}
264    
265    
266     \begin{enumerate}
267    
268     \item
269     On the machine where you execute the code
270     (most likely not the machine where you run TAF)
271     find the includes directory for MPI containing {\tt mpif.h}.
272     Either copy {\tt mpif.h} to the machine where you generate the
273     {\tt .f} files before TAF-ing, or add the path to the includes
274     directory to you genmake {\tt platform} setup,
275     TAF needs some MPI parameter settings
276     (essentially {\tt mpi\_comm\_world} and {\tt mpi\_integer})
277     to incorporate those in the adjoint code.
278    
279     \item
280     In {\tt ECCO\_CPPOPTIONS.h} set
281     %
282     {\footnotesize
283     \begin{verbatim}
284     #define ALLOW_DIVIDED_ADJOINT
285     #define ALLOW_DIVIDED_ADJOINT_MPI
286     \end{verbatim}
287     }
288     %
289     This will include the header file {\tt mpif.h}
290     into the top level routine for TAF.
291    
292     \item
293     Add the TAF option '{\tt -mpi}' to the TAF argument list in the makefile.
294    
295     \item
296     Follow the same steps as in {\bf Recipe 1} (previous section).
297    
298     \end{enumerate}
299    
300     That's it. Good luck \& have fun.
301    

  ViewVC Help
Powered by ViewVC 1.1.22