new debugging function
[cloog-ppl.git] / doc / cloog.texi
bloba7dfe972a1da0c37e2d3e345afaa400da68fa2c9
1 \input texinfo
2 @c %
3 @c %  /**-----------------------------------------------------------------**
4 @c %   **                              CLooG                              **
5 @c %   **-----------------------------------------------------------------**
6 @c %   **                            cloog.texi                           **
7 @c %   **-----------------------------------------------------------------**
8 @c %   **                   First version: july 6th 2002                  **
9 @c %   **-----------------------------------------------------------------**/
10 @c %
11 @c % release 1.0: september 17th 2002
12 @c % release 1.1: december   5th 2002
13 @c % release 1.2: april     22th 2003
14 @c % release 2.0: november  21th 2005 (and now in texinfo instead of LaTeX)
15 @c % release 2.1: october   15th 2007
16 @c %
17 @c %/**************************************************************************
18 @c % *               CLooG : the Chunky Loop Generator (experimental)         *
19 @c % **************************************************************************/
20 @c %/* CAUTION: the english used is probably the worst you ever read, please
21 @c % *          feel free to correct and improve it !
22 @c % */
24 @c %\textit{"I found the ultimate transformation functions, optimization for
25 @c %static control programs is now a closed problem, I have \textnormal{just}
26 @c %to generate the target code !"} 
30 @c % /*************************************************************************
31 @c %  *                              PART I: HEADER                           *
32 @c %  *************************************************************************/
33 @c %**start of header
34 @setfilename cloog.info
35 @settitle CLooG - a loop generator for scanning polyhedra
37 @set EDITION 2.1
38 @include gitversion.texi
39 @set UPDATED October 15th 2007
40 @setchapternewpage odd
42 @c %**end of header
44 @c % /*************************************************************************
45 @c %  *                 PART II: SUMMARY DESCRIPTION AND COPYRIGHT            *
46 @c %  *************************************************************************/
48 @copying
49 This manual is for CLooG version @value{VERSION}, a software
50 which generates loops for scanning Z-polyhedra. That is, CLooG produces a
51 code visiting each integral point of a union of parametrized
52 polyhedra. CLooG is designed to avoid control overhead and to produce a very
53 efficient code.
55 It would be quite kind to refer the following paper in any publication that
56 results from the use of the CLooG software or its library:
58 @example
59 @@InProceedings@{Bas04,
60 @ @ author =@ @ @ @ @{C. Bastoul@},
61 @ @ title =@ @ @ @ @ @{Code Generation in the Polyhedral Model
62 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Is Easier Than You Think@},
63 @ @ booktitle = @{PACT'13 IEEE International Conference on
64 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Parallel Architecture and Compilation Techniques@},
65 @ @ year =@ @ @ @ @ @ 2004,
66 @ @ pages =@ @ @ @ @ @{7--16@},
67 @ @ month =@ @ @ @ @ @{september@},
68 @ @ address =@ @ @ @{Juan-les-Pins@}
70 @end example
72 Copyright @copyright{} 2002-2005 C@'edric Bastoul.
74 @c quotation
75 Permission is granted to copy, distribute and/or modify this document under
76 the terms of the GNU Free Documentation License, Version 1.2 
77 published by the Free Software Foundation. To receive a copy of the
78 GNU Free Documentation License, write to the Free Software Foundation, Inc.,
79 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
80 @c end quotation
81 @end copying
83 @c % /*************************************************************************
84 @c %  *                 PART III: TITLEPAGE, CONTENTS, COPYRIGHT              *
85 @c %  *************************************************************************/
86 @titlepage
87 @title CLooG
88 @subtitle A Loop Generator For Scanning Polyhedra
89 @subtitle Edition @value{EDITION}, for CLooG @value{VERSION}
90 @subtitle @value{UPDATED}
91 @author C@'edric Bastoul
92      
93 @c The following two commands start the copyright page.
94 @page
95 @noindent (September 2001)
96 @table @code
97 @item C@'edric Bastoul
98 SCHEDULES GENERATE !!! I just need to apply them now, where can I find
99 a good code generator ?!
100      
101 @item Paul Feautrier
102 Hmmm. I fear that if you want something powerful enough, you'll have to
103 write it yourself !
104 @end table
106 @vskip 0pt plus 1filll
107 @insertcopying
108 @end titlepage
109      
110 @c Output the table of contents at the beginning.
111 @contents
113 @c % /*************************************************************************
114 @c %  *                     PART IV: TOP NODE AND MASTER MENU                 *
115 @c %  *************************************************************************/
116 @ifnottex
117 @node Top
118 @top CLooG
119      
120 @insertcopying
121 @end ifnottex
123 @menu
124 * Introduction::
125 * CLooG Software::
126 * CLooG Library::
127 @c * Hacking::
128 * Installing::
129 * Documentation::
130 * References::
131 @end menu
135 @c % /*************************************************************************
136 @c %  *                       PART V: BODY OF THE DOCUMENT                    *
137 @c %  *************************************************************************/
139 @c %  ****************************** INTRODUCTION ******************************
140 @node Introduction
141 @chapter Introduction
142 CLooG is a free software and library generating loops for scanning Z-polyhedra.
143 That is, it finds a code (e.g. in C, FORTRAN...) that reaches each integral
144 point of one or more parameterized polyhedra. CLooG has been originally
145 written to solve the code generation problem for optimizing compilers based on
146 the polytope model. Nevertheless it is used now in various area, e.g., to build
147 control automata for high-level synthesis or to find the best polynomial
148 approximation of a function. CLooG may help in any situation where scanning
149 polyhedra matters. It uses the best state-of-the-art code generation
150 algorithm known as the Quiller@'e et al. algorithm (@pxref{Qui00})
151 with our own improvements and extensions (@pxref{Bas04}).
152 The user has full control on generated code quality.
153 On one hand, generated code size has to be tuned for sake of
154 readability or instruction cache use. On the other hand, we must ensure that
155 a bad control management does not hamper performance of the generated code,
156 for instance by producing redundant guards or complex loop bounds.
157 CLooG is specially designed to avoid control overhead and to produce a very
158 efficient code.
160 CLooG stands for @emph{Chunky Loop Generator}: it is a part of the Chunky
161 project, a research tool for data locality improvement (@pxref{Bas03a}).
162 It is designed
163 also to be the back-end of automatic parallelizers like LooPo (@pxref{Gri04}).
164 Thus it is very
165 compilable code oriented and provides powerful program transformation
166 facilities. Mainly, it allows the user to specify very general schedules where, 
167 e.g., unimodularity or invertibility of the transformation doesn't matter.
169 The current version is still under
170 evaluation, and there is no guarantee that the upward compatibility
171 will be respected (but the previous API has been stable for two years,
172 we hope this one will be as successful -and we believe it-).
173 A lot of reports are necessary to freeze the library
174 API and the input file shape. Most API changes from 0.12.x to 0.14.x
175 have been requested by the users themselves.
176 Thus you are very welcome and encouraged
177 to post reports on bugs, wishes, critics, comments, suggestions or
178 successful experiences in the forum of @code{http://www.CLooG.org}
179 or to send them to cedric.bastoul@@inria.fr directly.
181 @menu
182 * Basics::
183 * Scattering::
184 @end menu
186 @node Basics
187 @section Basically, what's the point ?
188 If you want to use CLooG, this is because you want to scan or to find
189 something inside the integral points of a set of polyhedra. There are many
190 reasons for that. Maybe you need the generated code itself because it
191 actually implements a very smart program transformation you found.
192 Maybe you want to use the generated code
193 because you know that the solution of your problem belongs to the integral
194 points of those damned polyhedra and you don't know which one. Maybe you just
195 want to know if a polyhedron has integral points depending on some parameters,
196 which is the lexicographic minimum, maximum, the third on the basis of the
197 left etc. Probably you have your own reasons to use CLooG.
199 Let us illustrate a basic use of CLooG. Suppose we have a set of affine
200 constraints that describes a part of a whatever-dimensional space,
201 called a @strong{domain}, and we
202 want to scan it. Let us consider for instance the following set of constraints
203 where @samp{i}
204 and @samp{j} are the unknown (the two dimensions of the space) and
205 @samp{m} and @samp{n} are the parameters (some symbolic constants):
206 @example
207 @group
208 2<=i<=n
209 2<=j<=m
210 j<=n+2-i
211 @end group
212 @end example
213 Let us also consider that we have a partial knowledge of the parameter values,
214 called the @strong{context}, expressed as affine constraints as well,
215 for instance:
216 @example
217 @group
218 m>=2
219 n>=2
220 @end group
221 @end example
222 Note that using parameters is optional, if you are not comfortable with
223 parameter manipulation, just replace them with any scalar value that fits
224 @code{m>=2} and @code{n>=2}.
225 A graphical representation of this part of the 2-dimensional space, where
226 the integral points are represented using heavy dots would be for instance:
228 @image{images/basic,6cm}
230 The affine constraints of both the domain and the context are what we will
231 provide to CLooG as input (in a particular shape that will be described later).
232 The output of CLooG is a pseudo-code to scan the integral points of the
233 input domain according to the context:
234 @example
235 @group
236 for (i=2;i<=n;i++) @{
237   for (j=2;j<=min(m,-i+n+2);j++) @{    
238     S1(i,j) ;
239   @}
241 @end group
242 @end example
243 If you felt such a basic example is yet interesting, there is a good chance
244 that CLooG is appropriate for you. CLooG can do much more: scanning several
245 polyhedra or unions of polyhedra at the same time, applying general affine
246 transformations to the polyhedra, generate compilable code etc. Welcome
247 to the CLooG's user's guide !
249 @node Scattering
250 @section Defining a Scanning Order: Scattering Functions
251 In CLooG, domains only define the set of integral points to scan and their
252 coordinates. In particular, CLooG is free to choose the scanning order for
253 generating the most efficient code. This means, for optimizing/parallelizing
254 compiler people, that CLooG doesn't make any speculation on dependences on and
255 between statements (by the way, it's not its job !).
256 For instance, if an user give to
257 CLooG only two domains @code{S1:1<=i<=n}, @code{S2:1<=i<=n} and the context
258 @code{n>=1}, the following pseudo-codes are considered to be equivalent:
260 @example
261 @group
262 /* A convenient target pseudo-code. */
263 for (i=1;i<=N;i++) @{
264  S1(i) ;
266 for (i=1;i<=N;i++) @{
267  S2(i) ;
269 @end group
270 @end example
272 @example
273 @group
274 /* Another convenient target pseudo-code. */
275 for (i=1;i<=N;i++) @{
276  S1(i) ;
277  S2(i) ;
279 @end group
280 @end example
282 The default behaviour
283 of CLooG is to generate the second one, since it is optimized in control. 
284 It is right if there are no data dependences
285 between @code{S1} and @code{S2}, but wrong otherwise. 
287 Thus it is often useful to force scanning to respect a given order. This can be
288 done in CLooG by using @strong{scattering functions}. Scattering is a
289 shortcut for scheduling, allocation, chunking functions and the like we can
290 find in the restructuring compilation litterature. There are a lot of reasons
291 to scatter the integral points of the domains (i.e. the statement instances
292 of a program, for compilation people), parallelization or optimization are good
293 examples. For instance, if the user wants for any reason to set some
294 precedence constraints between the statements of our example above
295 in order to force the generation of the
296 first code, he can do it easily by setting (for example) the following
297 scheduling functions:
299 @tex
300 $$\theta _{S1}(i) =  (1)$$
301 $$\theta _{S2}(j) =  (2)$$
302 @end tex
304 @ifnottex
305 @example
306 @group
307 T_S1(i) = (1)
308 T_S2(j) = (2)
309 @end group
310 @end example
311 @end ifnottex
313 This scattering means that each integral point of the domain @code{S1}
314 is scanned at logical date @code{1} while each integral point of the domain
315 @code{S2} is scanned at logical date @code{2}. As a result, the whole
316 domain @code{S1} is scanned before domain @code{S2} and the first code in our
317 example is generated.
319 The user can set every kind of affine scanning order thanks to the
320 scattering functions. Each domain has its own scattering function and
321 each scattering function may be multi-dimensional. A multi-dimentional logical
322 date may be seen as classical date (year,month,day,hour,minute,etc.) where
323 the first dimensions are the most significant. Each scattering dimension
324 may depend linearly on the original dimensions (e.g., @code{i}), the
325 parameters (e.g., @code{n}) ans scalars (e.g., @code{2}).
327 A very useful example of multi-dimensional scattering functions is, for
328 compilation people, the scheduling of the original program.
329 The basic data to use for code generation are statement iteration domains.
330 As we saw, these data are not sufficient to rebuild the original
331 program (what is the ordering between instances of different statements ?).
332 The missing data can be put in the scattering functions as the original
333 scheduling. The method to compute it is quite simple (@pxref{Fea92}). The idea is to
334 build an abstract syntax tree of the program and to read the scheduling for
335 each statement. For instance, let us consider the following implementation of
336 a Cholesky factorization:
338 @example
339 @group
340 /* A Cholesky factorization kernel. */
341 for (i=1;i<=N;i++) @{
342   for (j=1;j<=i-1;j++) @{
343     a[i][i] -= a[i][j] ;           /* S1 */
344   @}
345   a[i][i] = sqrt(a[i][i]) ;        /* S2 */
346   for (j=i+1;j<=N;j++) @{
347     for (k=1;k<=i-1;k++) @{
348       a[j][i] -= a[j][k]*a[i][k] ; /* S3 */
349     @}
350     a[j][i] /= a[i][i] ;           /* S4 */
351     @}
352   @}
354 @end group
355 @end example
357 The corresponding abstract syntax tree is given in the following figure.
358 It directly gives the scattering functions (schedules) for all the
359 statements of the program.
361 @image{images/tree,6cm}
363 @tex
365 \hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (0,i,0,j,0)^T$\cr
366                 \theta _{S2}(i)        &$=  (0,i,1)^T$\cr
367                 \theta _{S3}(i,j,k)^T  &$=  (0,i,2,j,0,k,0)^T$\cr
368                 \theta _{S4}(i,j)^T    &$=  (0,i,2,j,1)^T$}$}
370 @end tex
372 @ifnottex
373 @example
374 @group
375 T_S1(i,j)^T   = (0,i,0,j,0)^T
376 T_S2(i)       = (0,i,1)^T
377 T_S3(i,j,k)^T = (0,i,2,j,0,k,0)^T
378 T_S4(i,j)^T   = (0,i,2,j,1)^T
379 @end group
380 @end example
381 @end ifnottex
383 These schedules depend on the iterators and give for each instance of each
384 statement a unique execution date. Using such scattering functions allow
385 CLooG to re-generate the input code. 
391 @c %  ***********************Using the CLooG Software **************************
392 @node CLooG Software
393 @chapter Using the CLooG Software
396 @menu
397 * A First Example::
398 * Writing The Input File::
399 * Calling CLooG::
400 * CLooG Options::
401 * Full Example::
402 @end menu
404 @c %/*************************************************************************
405 @c % *                              A FIRST EXAMPLE                          *
406 @c % *************************************************************************/
407 @node A First Example
408 @section A First Example
409 CLooG takes as input a file that must be written accordingly to a grammar
410 described in depth in a further section (@pxref{Writing The Input File}). 
411 Moreover it supports many options to tune the target code presentation or
412 quality as discussed in a dedicated section (@pxref{Calling CLooG}).
413 However, a basic use
414 of CLooG is not very complex and we present in this section how to generate the
415 code corresponding to a basic example discussed earlier (@pxref{Basics}).
417 The problem is to find the code that scans a 2-dimensional polyhedron
418 where @samp{i} and @samp{j} are the unknown (the two dimensions of the space)
419 and @samp{m} and @samp{n} are the parameters (the symbolic constants),
420 defined by the following set of constraints:
421 @example
422 @group
423 2<=i<=n
424 2<=j<=m
425 j<=n+2-i
426 @end group
427 @end example
428 @noindent We also consider a partial knowledge of the parameter values,
429 expressed thanks to the following affine constraints:
430 @example
431 @group
432 m>=2
433 n>=2
434 @end group
435 @end example
437 An input file that corresponds to this problem, and asks for a generated
438 code in C, may be the following. Note that we do not describe here precisely
439 the structure and the components of this file (@pxref{Writing The Input File}
440  for such information, if you feel it necessary):
442 @example
443 # ---------------------- CONTEXT ----------------------
444 c # language is C
446 # Context (constraints on two parameters)
447 2 4                   # 2 lines and 4 columns
448 # eq/in m  n  1         eq/in: 1 for inequality >=0, 0 for equality =0
449     1   1  0 -2       # 1*m + 0*n -2*1 >= 0, i.e. m>=2
450     1   0  1 -2       # 0*m + 1*n -2*1 >= 0, i.e. n>=2
452 1 # We want to set manually the parameter names
453 m n                   # parameter names
455 # --------------------- STATEMENTS --------------------
456 1 # Number of statements
458 1 # First statement: one domain
459 # First domain
460 5 6                   # 5 lines and 6 columns
461 # eq/in i  j  m  n  1 
462     1   1  0  0  0 -2 # i >= 2
463     1  -1  0  0  1  0 # i <= n
464     1   0  1  0  0 -2 # j >= 2
465     1   0 -1  1  0  0 # j <= m
466     1  -1 -1  0  1  2 # n+2-i>=j
467 0  0  0               # for future options
469 1 # We want to set manually the iterator names
470 i j                   # iterator names
472 # --------------------- SCATTERING --------------------
473 0 # No scattering functions
474 @end example
476 This file may be called @samp{basic.cloog}
477 (this example is provided in the CLooG distribution as
478 @code{test/manual_basic.cloog}) and we can ask CLooG to process it
479 and to generate the code by a simple calling to CLooG with this file as input:
480 @samp{cloog basic.cloog}. By default, CLooG will print the generated code in
481 the standard output:
483 @example
484 @group
485 /* Generated by CLooG v@value{VERSION} in 0.00s. */
486 for (i=2;i<=n;i++) @{
487   for (j=2;j<=min(m,-i+n+2);j++) @{    
488     S1(i,j) ;
489   @}
491 @end group
492 @end example
494 @c %/*************************************************************************
495 @c % *                                Input file                             *
496 @c % *************************************************************************/
497 @node Writing The Input File
498 @section Writing The Input File
499 The input text file contains a problem description, i.e. the context,
500 the domains and the scattering functions.
501 Because CLooG is very 'compilable code generation oriented', we can associate
502 some additional informations to each domain. We call this association a
503 @emph{statement}. The set of all informations is 
504 called a @emph{program}. The input file respects the grammar below
505 (terminals are preceeded by "_"):
507 @example
508 File             ::= Program
509 Program          ::= Context Statements Scattering
510 Context          ::= Language      Domain         Naming
511 Statements       ::= Nb_statements Statement_list Naming
512 Scattering       ::= Nb_functions  Domain_list    Naming
513 Naming           ::= Option Name_list
514 Name_list        ::= _String   Name_list      | (void)
515 Statement_list   ::= Statement Statement_list | (void)
516 Domain_list      ::= _Domain   Domain_list    | (void)
517 Statement        ::= Iteration_domain 0 0 0
518 Iteration_domain ::= Domain_union
519 Domain_union     ::= Nb_domains Domain_list
520 Option           ::= 0 | 1
521 Language         ::= c | f
522 Nb_statements    ::= _Integer
523 Nb_domains       ::= _Integer
524 Nb_functions     ::= _Integer
525 @end example
527 @itemize @bullet
528 @item  @samp{Context} represents the informations that are
529        shared by all the statements. It consists on
530        the language used (which can be @samp{c} for C or @samp{f} for FORTRAN 90)
531        and the global constraints on parameters.
532        These constraints are essential
533        since they give to CLooG the number of parameters. If there is no
534        parameter or no constraints on parameters, just give a constraint
535        always satisfied like @math{1 \geq 0}. @samp{Naming} sets the parameter
536        names.
537        If the naming option @samp{Option} is 1, parameter names will be read
538        on the next line. There must be exactly as many names as parameters.
539        If the naming option @samp{Option} is 0, parameter names are
540        automatically generated. The name of the first parameter will
541        be @samp{M}, and the name of the @math{(n+1)^{th}} parameter directly
542        follows the name of the @math{n^{th}} parameter in ASCII code.
543        It is the user responsibility to ensure that parameter names,
544        iterators and scattering dimension names are different. 
545 @item  @samp{Statements} represents the informations on the statements.
546        @samp{Nb_statements} is the number of statements in the program, 
547        i.e. the number of @samp{Statement} items in the @samp{Statement_list}.
548        @samp{Statement} represents the informations on a given statement.
549        To each statement is associated a domain
550        (the statement iteration domain: @samp{Iteration_domain}) and three
551        zeroes that represents future options.
552        @samp{Naming} sets the iterator names. If the naming option
553        @samp{Option} is 1, the iterator names
554        will be read on the next line. There must be exactly as many names as
555        nesting level in the deepest iteration domain. If the naming option
556        @samp{Option} is 0, iterator names are automatically generated.
557        The iterator name of the outermost loop will be @samp{i}, and the
558        iterator name of the loop at level @math{n+1} directly follows the 
559        iterator name of the loop at level @math{n} in ASCII code. 
560 @item  @samp{Scattering} represents the informations on scattering functions.
561        @samp{Nb_functions} is the number of functions (it must be
562        equal to the number of statements or 0 if there is no scattering
563        function). The function themselves are represented through
564        @samp{Domain_list}.
565        @samp{Naming} sets the scattering dimension names. If the naming option
566        @samp{Option} is 1, the scattering dimension names will be read on the
567        next line.
568        There must be exactly as many names as scattering dimensions. If the
569        naming option @samp{Option} is 0, scattering dimension names are automatically
570        generated. The name of the @math{n^{th}} scattering dimention
571        will be @samp{cn}.
572 @end itemize
574 @menu
575 * Domain Representation::
576 * Scattering Representation::
577 @end menu
579 @node Domain Representation
580 @subsection Domain Representation
581 As shown by the grammar, the input file describes the various informations
582 thanks to characters, integers and domains. Each domain is defined by a set of
583 constraints in the PolyLib format (@pxref{Wil93}). They have the
584 following syntax:
585 @enumerate
586 @item some optional comment lines beginning with @samp{#},
587 @item the row and column numbers, possibly followed by comments,
588 @item the constraint rows, each row corresponds to a constraint the
589       domain have to satisfy. Each row must be on a single line and is possibly
590       followed by comments. The constraint is an equality @math{p(x) = 0} if the
591       first element is 0, an inequality  @math{p(x) \geq 0} if the first element
592       is 1. The next elements are the unknown coefficients, followed by
593       the parameter coefficients. The last element is the constant factor.
594 @end enumerate
595 For instance, assuming that @samp{i}, @samp{j} and @samp{k} are iterators and
596 @samp{m} and @samp{n} are parameters, the domain defined by the following
597 constraints :
599 @tex
601 \hbox{$ \cases{ -i     + m &$\geq 0$\cr
602                     -j + n &$\geq 0$\cr
603                  i + j - k &$\geq 0$}$}
605 @end tex
607 @ifnottex
608 @example
609 @group
610    -i + m >= 0
611    -j + n >= 0
612 i + j - k >= 0
613 @end group
614 @end example
615 @end ifnottex
617 @noindent can be written in the input file as follows :
619 @example
620 @group
621 # This is the domain
622 3 7                      # 3 lines and 7 columns
623 # eq/in i  j  k  m  n  1 
624     1  -1  0  0  1  0  0 #    -i + m >= 0
625     1   0 -1  0  0  1  0 #    -j + n >= 0
626     1   1  1 -1  0  0  0 # i + j - k >= 0
627 @end group
628 @end example
630 Each iteration domain @samp{Iteration_domain} of a given statement
631 is a union of polyhedra
632 @samp{Domain_union}. A union is defined by its number of elements
633 @samp{Nb_domains} and the elements themselves @samp{Domain_list}.
634 For instance, let us consider the following pseudo-code:
636 @example
637 @group
638 for (i=1;i<=n;i++) @{
639   if ((i >= m) || (i <= 2*m))
640     S1 ;
641   for (j=i+1;j<=m;j++)
642     S2 ;
643 @} 
644 @end group
645 @end example
647 @noindent The iteration domain of @samp{S1} can be divided into two
648 polyhedra and written in the input file as follows:
650 @example
651 @group
652 2 # Number of polyhedra in the union
653 # First domain
654 3 5                # 3 lines and 5 columns
655 # eq/in i  m  n  1 
656     1   1  0  0 -1 #  i >= 1
657     1  -1  0  1  0 #  i <= n
658     1   1 -1  0  0 #  i >= m
659 # Second domain
660 3 5                # 3 lines and 5 columns
661 # eq/in i  m  n  1 
662     1   1  0  0 -1 #  i >= 1
663     1  -1  0  1  0 #  i <= n
664     1  -1  2  0  0 #  i <= 2*m
665 @end group
666 @end example
668 @node Scattering Representation
669 @subsection Scattering Function Representation
670 Scattering functions are depicted in the input file thanks a representation
671 very close to the domain one.
672 An integer gives the number of functions @samp{Nb_functions} and each function
673 is represented by a domain. Each line of the domain corresponds to an equality
674 defining a dimension of the function. Note that at present
675 (CLooG @value{VERSION})
676 @strong{all functions must have the same scattering dimension number}. If a
677 user wants to set scattering functions with different dimensionality, he has
678 to complete the smaller one with zeroes to reach the maximum dimensionality.
679 For instance, let us consider the following code and
680 scheduling functions:
682 @example
683 @group
684 for (i=1;i<=n;i++) @{
685   if ((i >= m) || (i <= 2*m))
686     S1 ;
687   for (j=i+1;j<=m;j++)
688     S2 ;
689 @} 
690 @end group
691 @end example
693 @tex
695 \hbox{$ \cases{ \theta _{S1}(i)      &$=  (i,0)^T$\cr
696                 \theta _{S2}(i,j)^T  &$=  (n,i+j)^T$}$}
698 @end tex
700 @ifnottex
701 @example
702 @group
703 T_S1(i)     = (i,0)^T
704 T_S2(i,j)^T = (n,i+j)^T
705 @end group
706 @end example
707 @end ifnottex
710 @noindent This scheduling can be written in the input file as follows:
712 @example
713 @group
714 2 # Number of scattering functions
715 # First function
716 2 7                          # 2 lines and 7 columns
717 # eq/in c1 c2  i  m  n  1 
718     0    1  0 -1  0  0  0    #  c1 = i
719     0    0  1  0  0  0  0    #  c2 = 0
720 # Second function
721 2 8                          # 2 lines and 8 columns
722 # eq/in c1 c2  i  j  m  n  1 
723     0    1  0  0  0  0 -1  0 #  c1 = n
724     0    0  1 -1 -1  0  0  0 #  c2 = i+j
725 @end group
726 @end example
727 The complete input file for the user who wants to generate the code for this
728 example with the preceding scheduling would be
729 (this file is provided in the CLooG distribution
730 as @code{test/manual_scattering.cloog}:
732 @example
733 # ---------------------- CONTEXT ----------------------
734 c # language is C
736 # Context (no constraints on two parameters)
737 1 4                   # 1 lines and 4 columns
738 # eq/in m  n  1
739     1   0  0  0       # 0 >= 0, always true
741 1 # We want to set manually the parameter names
742 m n                   # parameter names
744 # --------------------- STATEMENTS --------------------
745 2 # Number of statements
747 2 # First statement: two domains
748 # First domain
749 3 5                   # 3 lines and 5 columns
750 # eq/in i  m  n  1
751     1   1  0  0 -1    # i >= 1
752     1  -1  0  1  0    # i <= n
753     1   1 -1  0  0    # i >= m
754 # Second domain
755 3 5                   # 3 lines and 5 columns
756 # eq/in i  m  n  1 
757     1   1  0  0 -1    # i >= 1
758     1  -1  0  1  0    # i <= n
759     1  -1  2  0  0    # i <= 2*m
760 0  0  0               # for future options
762 1 # Second statement: one domain
763 4 6                   # 4 lines and 6 columns
764 # eq/in i  j  m  n  1 
765     1   1  0  0  0 -1 # i >= 1
766     1  -1  0  0  1  0 # i <= n
767     1  -1  1  0  0 -1 # j >= i+1
768     1   0 -1  1  0  0 # j <= m
769 0  0  0               # for future options
771 1 # We want to set manually the iterator names
772 i j                   # iterator names
774 # --------------------- SCATTERING --------------------
775 2 # Scattering functions
776 # First function
777 2 7                   # 2 lines and 7 columns
778 # eq/in p1 p2  i  m  n  1 
779     0    1  0 -1  0  0  0    # p1 = i
780     0    0  1  0  0  0  0    # p2 = 0
781 # Second function
782 2 8                   # 2 lines and 8 columns
783 # eq/in p1 p2  i  j  m  n  1 
784     0    1  0  0  0  0 -1  0 # p1 = n
785     0    0  1 -1 -1  0  0  0 # p2 = i+j
787 1 # We want to set manually the scattering dimension names
788 p1 p2                 # scattering dimension names
789 @end example
792 @c %/*************************************************************************
793 @c % *                             Calling CLooG                             *
794 @c % *************************************************************************/
795 @node Calling CLooG
796 @section Calling CLooG
797 CLooG is called by the following command:
798 @example
799        cloog [ options | file ]
800 @end example
801 The default behavior of CLooG is to read the input informations from a file and
802 to print the generated code or pseudo-code on the standard output.
803 CLooG's behavior and the output code shape is under the user control thanks
804 to many options which are detailed a further section (@pxref{CLooG Options}).
805 @code{file} is the input file. @code{stdin} is a special value: when used,
806 input is standard input. For instance, we can call CLooG to treat the
807 input file @code{basic.cloog} with default options by typing:
808 @code{cloog basic.cloog} or @code{more basic.cloog | cloog stdin}.
810 @c %/*************************************************************************
811 @c % *                             CLooG Options                             *
812 @c % *************************************************************************/
813 @node CLooG Options
814 @section CLooG Options
816 @menu
817 * Last Depth to Optimize Control::
818 * First Depth to Optimize Control::
819 * Simplify Convex Hull::
820 * Once Time Loop Elimination::
821 * Equality Spreading::
822 * Constant Spreading::
823 * First Level for Spreading::
824 * C PreProcessor Friendly::
825 * Statement Block::
826 * Loop Strides::
827 * Compilable Code::
828 * Output::
829 * Help::
830 * Version ::
831 @end menu
833 @node Last Depth to Optimize Control
834 @subsection Last Depth to Optimize Control @code{-l <depth>}
836 @code{-l <depth>}: this option sets the last loop depth to be optimized in
837 control. The higher this depth, the less control overhead.
838 For instance, with some input file, a user can generate
839 different pseudo-codes with different @code{depth} values as shown below.
840 @example
841 @group
842 /* Generated using a given input file and @strong{option -l 1} */
843 for (i=0;i<=M;i++) @{
844   S1 ;
845   for (j=0;j<=N;j++) @{
846     S2 ;
847   @}
848   for (j=0;j<=N;j++) @{
849     S3 ;
850   @}
851   S4 ;
853 @end group
854 @end example
855 @example
856 @group
857 /* Generated using the same input file but @strong{option -l 2} */
858 for (i=0;i<=M;i++) @{
859   S1 ;
860   for (j=0;j<=N;j++) @{
861     S2 ;
862     S3 ;
863   @}
864   S4 ;
866 @end group
867 @end example
868      In this example we can see that this option can change the operation
869      execution order between statements. Let us remind that CLooG does not
870      make any speculation on dependences between statements
871      (@pxref{Scattering}). Thus if nothing (i.e. scattering functions)
872      forbids this, CLooG considers the above codes to be equivalent.
873      If there is no scattering functions, the minimum value for @code{depth}
874      is 1 (in the case of 0, the user doesn't really need a loop generator !),
875      and the number of scattering dimensions otherwise (CLooG will warn the
876      user if he doesn't respect such constraint).
877      The maximum value for depth is -1 (infinity).
878      Default value is infinity.
880 @node First Depth to Optimize Control
881 @subsection First Depth to Optimize Control @code{-f <depth>}
883      @code{-f <depth>}: this option sets the first loop depth to be optimized
884      in control. The lower this depth, the less control overhead (and the longer
885      the generated code). For instance, with some input file, a user
886      can generate different pseudo-codes with different @code{depth} values
887      as shown below.
888      The minimum value for @code{depth} is 1, and the
889      maximum value is -1 (infinity).
890      Default value is 1.
891 @example
892 @group
893 /* Generated using a given input file and @strong{option -f 3} */
894 for (i=1;i<=N;i++) @{
895   for (j=1;j<=M;j++) @{
896     S1 ;
897     if (j >= 10) @{
898       S2 ;
899     @}
900   @}
902 @end group
903 @end example
904 @example
905 @group
906 /* Generated using the same input file but @strong{option -f 2} */
907 for (i=1;i<=N;i++) @{
908   for (j=1;j<=9;j++) @{
909     S1 ;
910   @}
911   for (j=10;j<=M;j++) @{
912     S1 ;
913     S2 ;
914   @}
916 @end group
917 @end example
919 @node Simplify Convex Hull
920 @subsection  Simplify Convex Hull @code{-sh <boolean>}
922      @code{-sh <boolean>}: this option enables (@code{boolean=1})
923      or forbids (@code{boolean=0}) a simplification step
924      that may simplify some constraints.
925      This option works only for generated code without
926      code duplication (it means, you have to tune @code{-f} and
927      @code{-l} options first to generate only a loop nest with internal
928      guards). For instance, with the input file @code{test/union.cloog}, a user
929      can generate different pseudo-codes  as shown below.
930      Default value is 0.
931 @example
932 @group
933 /* Generated using test/union.cloog and @strong{option -f -1 -l 2 -override} */
934 for (i=0;i<=11;i++) @{
935   for (j=max(0,5*i-50);j<=min(15,5*i+10);j++) @{
936     if ((i <= 10) && (j <= 10)) @{
937       S1 ;
938     @}
939     if ((i >= 1) && (j >= 5)) @{
940       S2 ;
941     @}
942   @}
944 @end group
945 @end example
946 @example
947 @group
948 /* Generated using the same input file but @strong{option -sh 1 -f -1 -l 2 -override} */
949 for (i=0;i<=11;i++) @{
950   for (j=0;j<=15;j++) @{
951     if ((i <= 10) && (j <= 10)) @{
952       S1 ;
953     @}
954     if ((i >= 1) && (j >= 5)) @{
955       S2 ;
956     @}
957   @}
959 @end group
960 @end example
962 @node Once Time Loop Elimination
963 @subsection Once Time Loop Elimination @code{-otl <boolean>}
965      @code{-otl <boolean>}: this option allows (@code{boolean=1}) or
966      forbids (@code{boolean=0}) the simplification of loops running
967      once. Default value is 1.
968 @example
969 @group
970 /* Generated using a given input file and @strong{option -otl 0} */
971 for (j=i+1;j<=i+1;j++) @{
972   S1 ;
974 @end group
975 @end example
976 @example
977 @group
978 /* Generated using the same input file but @strong{option -otl 1} */
979 j = i+1 ;
980 S1 ;
981 @end group
982 @end example
985 @node Equality Spreading 
986 @subsection Equality Spreading @code{-esp <boolean>}
988      @code{-esp <boolean>}: this option allows (@code{boolean=1}) or
989      forbids (@code{boolean=0}) values spreading when there
990      are equalities. Default value is 0.
991 @example
992 @group
993 /* Generated using a given input file and @strong{option -esp 0} */
994 i = M+2 ;
995 j = N ;
996 for (k=i;k<=j+M;k++) @{
997   S1 ;
999 @end group
1000 @end example
1001 @example
1002 @group
1003 /* Generated using the same input file but @strong{option -esp 1} */
1004 for (k=M+2;k<=N+M;k++) @{
1005   S1(i = M+2, j = N) ;
1007 @end group
1008 @end example
1011 @node Constant Spreading 
1012 @subsection Constant Spreading @code{-csp <boolean>}
1014      @code{-csp <boolean>}: this option allows (@code{boolean=1}) or
1015      forbids (@code{boolean=0}) values spreading when
1016      there are @emph{constant} equalities. That is, when the right member
1017      of the equality is a constant term. Default value is 1.
1018 @example
1019 @group
1020 /* Generated using a given input file and @strong{option -csp 0} */
1021 i = M+2 ;
1022 j = N ;
1023 for (k=i;j<=j+M;j++) @{
1024   S1 ;
1026 @end group
1027 @end example
1028 @example
1029 @group
1030 /* Generated using the same input file but @strong{option -csp 1} */
1031 i = M+2 ;
1032 for (k=i;k<=N+M;k++) @{
1033   S1(j = N) ;
1035 @end group
1036 @end example
1039 @node First Level for Spreading 
1040 @subsection First Level for Spreading @code{-fsp <level>}
1042      @code{-fsp <level>}: it can be useful to set a
1043      first level to begin equality spreading. Particularly when using
1044      scattering functions, the user may want to see the scattering dimension
1045      values instead of spreading or hiding them. If user has set a
1046      spreading, @code{level} is
1047      the first level to start it. Default value is 1.
1048 @example
1049 @group
1050 /* Generated using a given input file and @strong{option -fsp 1} */
1051 for (j=0;j<=N+M;j++) @{
1052   S1(i = N) ;
1054 for (j=0;j<=N+M;j++) @{
1055   S1(i = M) ;
1057 @end group
1058 @end example
1059 @example
1060 @group
1061 /* Generated using the same input file but @strong{option -fsp 2} */
1062 c1 = N ;
1063 for (j=0;j<=c1+M;j++) @{
1064   S1(i = c1) ;
1066 c1 = M ;
1067 for (j=0;j<=N+c1;j++) @{
1068   S1(i = c1) ;
1070 @end group
1071 @end example
1074 @node C PreProcessor Friendly 
1075 @subsection C PreProcessor Friendly @code{-cpp <boolean>}
1077      @code{-cpp <boolean>}: this option ask CLooG for printing a less
1078      human-readable but compilable code by using the C preprocessor
1079      (@code{boolean=1}). In this case each statement is written as a
1080      function of the iterators corresponding to its domain dimensions:
1081      @code{Si(value_of_iterator_1,...,value_of_iterator_n)}. It follows
1082      that the user can easily add preprocessor macros to define each
1083      statement and use the generated textual code directly for compilation.
1084      When @code{boolean} is set to 0, the pretty printer has the default
1085      behaviour. Default value is 0.
1086 @example
1087 @group
1088 /* Generated using a given input file and @strong{option -cpp 0} */
1089 for (j=0;j<=N+M;j++) @{
1090   S1(i = N) ;
1092 @end group
1093 @end example
1094 @example
1095 @group
1096 /* Generated using the same input file but @strong{option -cpp 1} */
1097 /* and a preprocessor macro set by the user */
1099 #define S1(i,j) A[(j)]=3*(i)
1101 for (j=0;j<=N+M;j++) @{
1102   S1(N,j) ;
1104 @end group
1105 @end example
1107 @node Statement Block  
1108 @subsection Statement Block @code{-block <boolean>}
1110      @code{-block <boolean>}: this option allows (@code{boolean=1}) to
1111      create a statement block for each new iterator, even if there is only
1112      an equality. This can be useful in order to parse the generated
1113      pseudo-code. When @code{boolean} is set to 0 or when the generation
1114      language is FORTRAN, this feature is disabled. Default value is 0.
1115 @example
1116 @group
1117 /* Generated using a given input file and @strong{option -block 0} */
1118 i = M+2 ;
1119 j = N ;
1120 S1 ;
1121 @end group
1122 @end example
1123 @example
1124 @group
1125 /* Generated using the same input file but @strong{option -block 1} */
1126 @{ i = M+2 ;
1127   @{ j = N ;
1128     S1 ;
1129   @}
1131 @end group
1132 @end example
1135 @node Loop Strides 
1136 @subsection Loop Strides @code{-strides <boolean>}
1138      @code{-strides <boolean>}: this options allows (@code{boolean=1}) to
1139      handle non-unit strides for loop increments. This can remove a lot of
1140      guards and make the generated code more efficient. Default value is 0.
1141 @example
1142 @group
1143 /* Generated using a given input file and @strong{option -strides 0} */
1144 for (i=1;i<=n;i++) @{
1145   if (i%2 == 0) @{
1146     S1(j = i/2) ;
1147   @}
1148   if (i%4 == 0) @{
1149     S2(j = i/4) ;
1150   @}
1152 @end group
1153 @end example
1154 @example
1155 @group
1156 /* Generated using the same input file but @strong{option -strides 1} */
1157 for (i=2;i<=n;i+=2) @{
1158   S1(j = i/2) ;
1159   if (i%4 == 0) @{
1160     S2(j = i/4) ;
1161   @}
1163 @end group
1164 @end example
1166 @node Compilable Code
1167 @subsection Compilable Code @code{-compilable <value>}
1169      @code{-compilable <value>}: this options allows (@code{value} is not 0)
1170      to generate a compilable code where all parameters have the integral value
1171      @code{value}. This option creates a macro for each statement. Since
1172      CLooG do not know anything about the statement sources, it fills the
1173      macros with a basic increment that computes the total number of
1174      scanned integral points. The user may change easily the macros according
1175      to his own needs. This option is possible only if the generated code is
1176      in C. Default value is 0.
1177 @example
1178 @group
1179 /* Generated using a given input file and @strong{option -compilable 0} */
1180 for (i=0;i<=n;i++) @{
1181   for (j=0;j<=n;j++) @{
1182     S1 ;
1183     S2 ;
1184   @}
1185   S3 ;
1187 @end group
1188 @end example
1189 @example
1190 /* Generated using the same input file but @strong{option -compilable 10} */
1191 /* DON'T FORGET TO USE -lm OPTION TO COMPILE. */
1193 /* Useful headers. */
1194 #include <stdio.h>
1195 #include <stdlib.h>
1196 #include <math.h>
1198 /* Parameter value. */
1199 #define PARVAL 10
1201 /* Statement macros (please set). */
1202 #define S1(i,j) @{total++;@}
1203 #define S2(i,j) @{total++;@}
1204 #define S3(i)   @{total++;@}
1206 int main() @{
1207   /* Original iterators. */
1208   int i, j ;
1209   /* Parameters. */
1210   int n=PARVAL, total=0 ;
1212   for (i=0;i<=n;i++) @{
1213     for (j=0;j<=n;j++) @{
1214       S1(i,j) ;
1215       S2(i,j) ;
1216     @}
1217     S3(i) ;
1218   @}
1220   printf("Number of integral points: %d.\n",total) ;
1221   return 0 ;
1223 @end example
1225 @node Output
1226 @subsection Output @code{-o <output>}
1228      @code{-o <output>}: this option sets the output file. @code{stdout} is a
1229      special value: when used, output is standard output.
1230      Default value is @code{stdout}.
1232 @node Help
1233 @subsection Help @code{--help} or @code{-h}
1235      @code{--help} or @code{-h}: this option ask CLooG to print a short help.
1237 @node Version
1238 @subsection Version @code{--version} or @code{-v}
1240      @code{--version} or @code{-v}: this option ask CLooG to print some version
1241      informations.
1244 @c %/*************************************************************************
1245 @c % *                           A Full Example                              *
1246 @c % *************************************************************************/
1247 @node Full Example
1248 @section A Full Example
1250 Let us consider the allocation problem of a Gaussian elimination, i.e. we want
1251 to distribute the various statement instances of the compute kernel onto
1252 different processors. The original code is the following:
1253 @example
1254 @group
1255 for (i=1;j<=N-1;i++) @{
1256   for (j=i+1;j<=N;j++) @{
1257     c[i][j] = a[j][i]/a[i][i] ;    /* S1 */
1258     for (k=i+1;k<=N;k++) @{
1259       a[j][k] -= c[i][j]*a[i][k] ; /* S2 */
1260     @}
1261   @}
1263 @end group
1264 @end example
1266 @noindent The best affine allocation functions can be found by any good automatic
1267 parallelizer like LooPo (@pxref{Gri04}):
1269 @tex
1271 \hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i)$\cr
1272                 \theta _{S2}(i,j,k)^T  &$=  (k)$}$}
1274 @end tex
1276 @ifnottex
1277 @example
1278 @group
1279 T_S1(i,j)^T   = (i)
1280 T_S2(i,j,k)^T = (k)
1281 @end group
1282 @end example
1283 @end ifnottex
1285 @noindent To ensure that on each processor, the set of statement instances is
1286 executed according to the original ordering, we add as minor scattering
1287 dimensions the original scheduling (@pxref{Scattering}):
1289 @tex
1291 \hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0)^T$\cr
1292                 \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
1294 @end tex
1296 @ifnottex
1297 @example
1298 @group
1299 T_S1(i,j)^T   = (i,0,i,0,j,0)^T
1300 T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
1301 @end group
1302 @end example
1303 @end ifnottex
1305 @noindent To ensure that the scattering functions have the same dimensionality, we
1306 complete the first function with zeroes
1307 (this is a CLooG @value{VERSION} and previous versions requirement,
1308 it should be removed in a future version, don't worry it's absolutly legal !):
1310 @tex
1312 \hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0,0,0)^T$\cr
1313                 \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
1315 @end tex
1317 @ifnottex
1318 @example
1319 @group
1320 T_S1(i,j)^T   = (i,0,i,0,j,0,0,0)^T
1321 T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
1322 @end group
1323 @end example
1324 @end ifnottex
1326 @noindent The input file corresponding to this code generation problem
1327 could be (this file is provided in the CLooG distribution
1328 as @code{test/manual_gauss.cloog}:
1330 @example
1331 # ---------------------- CONTEXT ----------------------
1332 c # language is C
1334 # Context (no constraints on one parameter)
1335 1 3                     # 1 line and 3 columns    
1336 # eq/in n  1
1337     1   0  0            # 0 >= 0, always true
1339 1 # We want to set manually the parameter name
1340 n                       # parameter name
1342 # --------------------- STATEMENTS --------------------
1343 2 # Number of statements
1345 1 # First statement: one domain
1346 4 5                     # 4 lines and 3 columns
1347 # eq/in i  j  n  1
1348     1   1  0  0 -1      # i >= 1
1349     1  -1  0  1 -1      # i <= n-1
1350     1  -1  1  0 -1      # j >= i+1
1351     1   0 -1  1  0      # j <= n
1352 0  0  0                 # for future options
1355 # Second statement: one domain
1356 6 6                     # 6 lines and 3 columns
1357 # eq/in i  j  k  n  1
1358     1   1  0  0  0 -1   # i >= 1
1359     1  -1  0  0  1 -1   # i <= n-1
1360     1  -1  1  0  0 -1   # j >= i+1
1361     1   0 -1  0  1  0   # j <= n
1362     1  -1  0  1  0 -1   # k >= i+1
1363     1   0  0 -1  1  0   # k <= n
1364 0  0  0                 # for future options
1366 0 # We let CLooG set the iterator names
1368 # --------------------- SCATTERING --------------------
1369 2 # Scattering functions
1370 # First function
1371 8 13                    # 3 lines and 3 columns
1372 # eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  n  1
1373     0    1  0  0  0  0  0  0  0 -1  0  0  0     # p1 = i
1374     0    0  1  0  0  0  0  0  0  0  0  0  0     # p2 = 0
1375     0    0  0  1  0  0  0  0  0 -1  0  0  0     # p3 = i
1376     0    0  0  0  1  0  0  0  0  0  0  0  0     # p4 = 0
1377     0    0  0  0  0  1  0  0  0  0 -1  0  0     # p5 = j
1378     0    0  0  0  0  0  1  0  0  0  0  0  0     # p6 = 0
1379     0    0  0  0  0  0  0  1  0  0  0  0  0     # p7 = 0
1380     0    0  0  0  0  0  0  0  1  0  0  0  0     # p8 = 0
1381 # Second function
1382 8 14                    # 3 lines and 3 columns
1383 # eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  k  n  1
1384     0    1  0  0  0  0  0  0  0  0  0 -1  0  0  # p1 = k
1385     0    0  1  0  0  0  0  0  0  0  0  0  0  0  # p2 = 0
1386     0    0  0  1  0  0  0  0  0 -1  0  0  0  0  # p3 = i
1387     0    0  0  0  1  0  0  0  0  0  0  0  0  0  # p4 = 0
1388     0    0  0  0  0  1  0  0  0  0 -1  0  0  0  # p5 = j
1389     0    0  0  0  0  0  1  0  0  0  0  0  0 -1  # p6 = 1
1390     0    0  0  0  0  0  0  1  0  0  0 -1  0  0  # p7 = k
1391     0    0  0  0  0  0  0  0  1  0  0  0  0  0  # p8 = 0
1393 1 # We want to set manually the scattering dimension names
1394 p1 p2 p3 p4 p5 p6 p7 p8 # scattering dimension names
1395 @end example
1397 Calling CLooG, with for instance the command line
1398 @code{cloog -fsp 2 gauss.cloog} for a better view
1399 of the allocation (the processor number is given by @code{p1}),
1400 will result on the following target code that actually implements
1401 the transformation. A minor processing on the dimension @code{p1}
1402 to implement, e.g., MPI calls, which is not shown here may
1403 result in dramatic speedups !
1405 @example
1406 if (n >= 2) @{
1407   p1 = 1 ;
1408   for (p5=2;p5<=n;p5++) @{
1409     S1(i = 1,j = p5) ;
1410   @}
1412 for (p1=2;p1<=n-1;p1++) @{
1413   for (p3=1;p3<=p1-1;p3++) @{
1414     for (p5=p3+1;p5<=n;p5++) @{
1415       S2(i = p3,j = p5,k = p1) ;
1416     @}
1417   @}
1418   for (p5=p1+1;p5<=n;p5++) @{
1419     S1(i = p1,j = p5) ;
1420   @}
1422 if (n >= 2) @{
1423   p1 = n ;
1424   for (p3=1;p3<=n-1;p3++) @{
1425     for (p5=p3+1;p5<=n;p5++) @{
1426       S2(i = p3,j = p5,k = n) ;
1427     @}
1428   @}
1430 @end example
1433 @c %/*************************************************************************
1434 @c % *                           A Full Example                              *
1435 @c % *************************************************************************/
1436 @node CLooG Library
1437 @chapter Using the CLooG Library
1438 The CLooG Library was implemented to allow the user to call CLooG
1439 directly from his programs, without file accesses or system calls. The
1440 user only needs to link his programs with C libraries. The CLooG
1441 library mainly provides one function (@code{cloog_program_generate})
1442 which takes as input the problem
1443 description with some options, and returns the data structure corresponding
1444 to the generated code (a @code{CloogProgram} structure) which is more or less
1445 an abstract syntax tree.
1446 The user can work with this data structure and/or use
1447 our pretty printing function to write the final code in either C or FORTRAN.
1448 Some other functions are provided for convenience reasons.
1449 These functions as well as the data structures are described in this section.
1451 @menu
1452 * CLooG Data Structures::
1453 * CLooG Functions::
1454 * Example of Library Utilization::
1455 @end menu
1458 @node CLooG Data Structures
1459 @section CLooG Data Structures Description
1460 In this section, we describe the data structures used by the loop
1461 generator to represent and to process a code generation problem.
1463 @menu
1464 * CloogMatrix::
1465 * CloogDomain::
1466 * CloogDomainList::
1467 * CloogStatement::
1468 * CloogBlock::
1469 * CloogBlockList::
1470 * CloogLoop::
1471 * CloogNames::
1472 * CloogProgram::
1473 * CloogOptions::
1474 @end menu
1477 @node CloogMatrix
1478 @subsection CloogMatrix
1479 @example
1480 @group
1481 #define CloogMatrix Matrix
1482 @end group
1483 @end example
1485 @noindent The @code{CloogMatrix} structure is directly the PolyLib
1486 @code{Matrix} data structure (@pxref{Wil93}). This structure is devoted to
1487 represent a set of constraints. It is 
1488 defined in @code{polylib/types.h} as the following:
1490 @example
1491 @group
1492 struct matrix
1493 @{ unsigned NbRows ;    /* Number of rows. */
1494   unsigned NbColumns ; /* Number of columns. */
1495   Value ** p ;         /* Array of pointers to the matrix rows. */
1496   Value * p_Init ;     /* Matrix rows contiguously in memory. */
1497   int p_Init_size ;    /* For internal use. */
1499 typedef struct matrix Matrix;
1500 @end group
1501 @end example
1503 @noindent The whole matrix is stored in memory row after row at the
1504 @code{p_Init} address. @code{p} is an array of pointers where
1505 @code{p[i]} points to the first element of the @math{i^{th}} row.
1506 @code{NbRows} and @code{NbColumns} are respectively the number of
1507 rows and columns of the matrix. 
1508 Each row corresponds to a constraint. The first element of each row is an
1509 equality/inequality tag. The
1510 constraint is an equality @math{p(x) = 0} if the first element is 0, but it is
1511 an inequality @math{p(x) \geq 0} if the first element is 1.
1512 The next elements are the unknown coefficients, followed by the parameter
1513 coefficients, then the scalar coefficient.
1514 For instance, the following three constraints:
1516 @tex
1518 \hbox{$ \cases{ -i + m       &$= 0$\cr
1519                 -j + n       &$\geq 0$\cr
1520                  j + i - k   &$\geq 0$}$}
1522 @end tex
1524 @ifnottex
1525 @example
1526 @group
1527     -i + m  = 0
1528     -j + n >= 0
1529  i + j - k >= 0
1530 @end group
1531 @end example
1532 @end ifnottex
1534 @noindent would be represented by the following rows:
1536 @example
1537 @group
1538 # eq/in  i   j   k   m   n   cst
1539     0    0  -1   0   1   0    0 
1540     1   -1   0   0   0   1    0 
1541     1    1   1  -1   0   0    0 
1542 @end group
1543 @end example
1545 @noindent To be able to provide different precision version (CLooG
1546 supports 32 bits, 64 bits and arbitrary precision through the GMP library),
1547 the @code{Value} type depends on the configuration options (it may be
1548 @code{long int} for 32 bits version, @code{long long int} for 64 bits version,
1549 and @code{mpz_t} for multiple precision version).
1550 The @code{p_Init_size} field is needed by the PolyLib to free
1551 the memory allocated by @code{mpz_init} in the multiple precision release.
1552 Set this field to 0 if you are @emph{not} using multiple precision.
1553 Set this field to the size of the @code{p_Init} array if you
1554 initialized it yourself and if you are using the multiple precision version.
1557 @node CloogDomain
1558 @subsection CloogDomain
1559 @example
1560 @group
1561 struct cloogdomain
1562 @{ Polyhedron * polyhedron ;  /* The polyhedral domain. */
1563 @} ;
1564 typedef struct cloogdomain CloogDomain ;
1565 @end group
1566 @end example
1568 @noindent The @code{CloogDomain} structure contains a PolyLib
1569 @code{Polyhedron} data structure which represents a polyhedral domain
1570 (a union of polyhedra) in both constraint representation and its dual
1571 ray representation (@pxref{Wil93}).
1572 It is defined in @code{polylib/types.h} as the following:
1574 @example
1575 @group
1576 struct polyhedron
1577 @{ unsigned Dimension,        /* Number of dimensions. */
1578            NbConstraints,    /* Number of constraints. */
1579            NbRays,           /* Number of rays. */
1580            NbEq,             /* Number of vertices (?). */
1581            NbBid ;           /* Number of extremal rays (?). */
1582   Value ** Constraint ;      /* Pointers to constraints. */
1583   Value ** Ray ;             /* Pointers to rays. */
1584   Value * p_Init ;           /* Constraints and rays contiguously. */
1585   int p_Init_size ;          /* For internal use. */
1586   struct polyhedron * next ; /* Next component of the union. */
1588 typedef struct polyhedron Polyhedron;
1589 @end group
1590 @end example
1592 @noindent The constraint representation is quite the same as in
1593 the @code{Matrix} data structure (@pxref{CloogMatrix}). The number of
1594 rows is @code{NbConstraints} and the
1595 number of columns in the @code{Polyhedron} structure is
1596 @code{Dimension+2} (the @math{+2} comes from the equality/inequality
1597 tag and the scalar coefficient). As in the @code{Matrix} structure,
1598 The data are stored in memory contiguously at the
1599 @code{p_Init} address and the @code{p_Init_size} field is used for
1600 memory deallocation in the multiple precision case (@pxref{CloogMatrix}).
1601 For a better understanding of the
1602 dual ray representation, the user may refer to the PolyLib documentation.
1605 @node CloogDomainList
1606 @subsection CloogDomainList
1607 @example
1608 @group
1609 struct cloogdomainlist
1610 @{ CloogDomain * domain ;
1611   struct cloogdomainlist * next ;
1612 @} ;
1613 typedef struct cloogdomainlist CloogDomainList ;
1614 @end group
1615 @end example
1617 @noindent The CloogDomainList structure represents a @code{NULL} terminated linked list
1618 of domains.
1621 @node CloogStatement
1622 @subsection CloogStatement
1623 @example
1624 @group
1625 struct cloogstatement
1626 @{ int number ;                  /* The statement unique number. */
1627   void * usr ;                  /* Pointer for user's convenience. */
1628   struct cloogstatement * next ;/* Next element of the linked list. */
1629 @} ;
1630 typedef struct cloogstatement CloogStatement ;
1631 @end group
1632 @end example
1634 @noindent The @code{CloogStatement} structure represents a @code{NULL}
1635 terminated linked
1636 list of statements. In CLooG, a statement is only defined by its unique
1637 number (@code{number}). The user can use the pointer @code{usr} for his
1638 own convenience to link his own statement representation to the
1639 corresponding @code{CloogStatement} structure. The whole management of the
1640 @code{usr} pointer is under the responsibility of the user, in particular,
1641 CLooG never tries to print, to allocate or to free a memory block pointed
1642 by @code{usr}. 
1645 @node CloogBlock
1646 @subsection CloogBlock
1647 @example
1648 @group
1649 struct cloogblock
1650 @{ CloogStatement * statement ; /* Statement list of the block. */
1651   CloogMatrix * scattering ;   /* Scattering function of the block. */
1652   int depth ;                  /* Original block depth.*/
1653   void * usr;                  /* Pointer for user's convenience. */
1654 @} ;
1655 typedef struct cloogblock CloogBlock ;
1656 @end group
1657 @end example
1659 @noindent The @code{CloogBlock} structure represents a statement block.
1660 In a statement block, every statements have the same iteration
1661 domain and the same scattering function (actually, the scattering
1662 functions may differ only by a scalar
1663 coefficient if it just precises the ordering of the statements within
1664 the block). @code{statement} is the statement list where the
1665 statement order matters, @code{scattering} is one of
1666 the statement scattering functions and
1667 @code{depth} is the number of dimensions of the
1668 iteration domain (only the unknown, not the tag/parameters/scalar).
1669 @code{usr} is a pointer for library user's convenience. Note this pointer
1670 is never allocated, freed or printed by CLooG.
1672 @node CloogBlockList
1673 @subsection CloogBlockList
1674 @example
1675 @group
1676 struct cloogdblocklist
1677 @{ CloogBlock * block ;
1678   struct cloogblocklist * next ;
1679 @} ;
1680 typedef struct cloogblocklist CloogBlockList ;
1681 @end group
1682 @end example
1684 @noindent The CloogBlockList structure represents a @code{NULL} terminated linked list
1685 of blocks.
1688 @node CloogLoop
1689 @subsection CloogLoop 
1690 @example
1691 @group
1692 struct cloogloop
1693 @{ CloogDomain * domain;       /* Iteration domain. */
1694   Value stride ;               /* Loop stride. */
1695   CloogBlock * block ;         /* Included statement block.*/
1696   void * usr;                  /* Pointer for user's convenience. */
1697   struct cloogloop * inner ;   /* Loop at the next level. */
1698   struct cloogloop * next ;    /* Next loop at the same level. */
1699 @} ;
1700 typedef struct cloogloop CloogLoop ;
1701 @end group
1702 @end example
1704 @noindent The @code{CloogLoop} structure represents a loop.
1705 First of all, a
1706 loop has an iteration domain (@code{domain}). The iterator's stride for loop
1707 increment is @code{stride}. The loop can include a statement block
1708 in the field @code{block}. If there is no included statement block,
1709 @code{block} is set to @code{NULL}. @code{usr} is a pointer for library
1710 user's convenience. Note that this pointer is never allocated, freed or
1711 printed by CLooG. @code{inner} is a pointer to the inner
1712 loop, and @code{next} a pointer to the next loop in the textual order. If
1713 there are no inner loop or no next loop, the corresponding pointer is set
1714 to @code{NULL}.
1717 @node CloogNames
1718 @subsection CloogNames
1719 @example
1720 @group
1721 struct cloognames
1722 @{ int nb_scattering ;         /* Scattering dimension number. */
1723   int nb_iterators ;          /* Iterator number. */
1724   int nb_parameters ;         /* Parameter number. */
1725   char ** scattering ;        /* The scattering dimension names. */
1726   char ** iterators ;         /* The iterator names. */
1727   char ** parameters ;        /* The parameter names. */
1728 @} ;
1729 typedef struct cloognames CloogNames ;
1730 @end group
1731 @end example
1733 @noindent The @code{CloogNames} structure represents the scattering dimension,
1734 the iterator and the parameter names in the final program.
1735 @code{nb_scattering} 
1736 (respectively @code{nb_iterators} and @code{nb_parameters})
1737 is the number of scattering dimensions number
1738 (respectively the iterator and parameter number)
1739 and of elements in the corresponding array of strings
1740 @code{scattering}
1741 (respectively @code{iterators} and @code{parameters}).
1742 The @math{i^{th}} scattering dimension name will be associated with the
1743 to the dimension @math{i} of the scattering function.
1744 The @math{i^{th}} iterator name will be associated with the
1745 dimension @math{i} of the iteration domain. 
1746 The @math{i^{th}} parameter name will be associated with the
1747 dimension @math{i} of the context polyhedron.
1748 The user has to ensure that there are
1749 enough scattering dimension, iterator and parameter names. 
1752 @node CloogProgram
1753 @subsection CloogProgram
1754 @example
1755 @group
1756 struct cloogprogram
1757 @{ char language ;              /* The language of the program. */
1758   int  nb_scattdims ;          /* Scattering dimension number. */
1759   CloogNames  * names ;        /* Iterators and parameters names. */
1760   CloogDomain * context ;      /* The context of the program. */
1761   CloogLoop   * loop ;         /* The loops of the program. */
1762   CloogBlockList * blocklist ; /* The statement block list. */
1763   void * usr;                  /* For library user's convenience. */
1764 @} ;
1765 typedef struct cloogprogram CloogProgram ;
1766 @end group
1767 @end example
1769 @noindent The @code{CloogProgram} structure represents a static control program kernel.
1770 @code{language} precises the language (@code{c} for C or @code{f} for FORTRAN).
1771 @code{nb_scattdims} gives the number of scattering dimensions.
1772 @code{context} is a pointer to the constraints on the program parameters,
1773 it can't be the
1774 @code{NULL} pointer even if there are no constraints on parameters. In such a
1775 case, set a polyhedron with as many dimensions as there are parameters, with
1776 an @emph{always true} constraint like @math{1 \geq 0} (this is necessary
1777 since the number of parameters is deduced from the dimension number of
1778 the context constraints). @code{loop} is a pointer
1779 to the first loop of the program. @code{names} is a pointer to the various
1780 element names (scattering dimension, iterators, parameters)
1781 of the final program. @code{names} can be the @code{NULL}
1782 pointer if the user do not want to use our pretty printing function.
1783 @code{blocklist} is the linked list of all the statement block structures.
1784 @code{usr} is a pointer for library user's convenience. Note that this pointer
1785 is never allocated, freed or printed by CLooG.
1786 As an example, let us consider the following loop nest:
1787 @example
1788 @group
1789 for (i=0; i<=n; i++) @{ 
1790   for (j=0; j<=n; j++) @{
1791     S1 ;
1792     S2 ;
1793   @}
1794   for (j=n+1; j<=2*n; j++) @{
1795     S3 ;
1796   @}
1797 @}  
1798 @end group
1799 @end example
1800 @noindent The next figure gives a possible representation in memory for this
1801 program thanks to the CLooG data structures (it has been actually printed
1802 by the @code{cloog_program_print} function). In this figure,
1803 @samp{+-- CloogLoop} denotes an @samp{inner} loop, while a @samp{CloogLoop}
1804 on the same column pointed by an arrow denotes a @samp{next} loop:
1806 @smallexample
1807 +-- CloogProgram
1808 |       |       
1809 |       Language: c
1810 |       |       
1811 |       Scattering dimension number: 0
1812 |       |       
1813 |       +-- CloogNames
1814 |       |       |       
1815 |       |       Scattering dimension number: 0
1816 |       |       |       
1817 |       |       +-- No scattering string
1818 |       |       |       
1819 |       |       Iterator number -----------: 2
1820 |       |       |       
1821 |       |       +-- Iterator strings ------: i j
1822 |       |       |       
1823 |       |       Parameter number ----------: 1
1824 |       |       |       
1825 |       |       +-- Parameter strings -----: n
1826 |       |       
1827 |       +-- Context
1828 |       |       [   1    1   -2  ]
1829 |       |       [   1    0    1  ]
1830 |       |       
1831 |       +-- CloogLoop
1832 |       |       |       
1833 |       |       +-- CloogDomain
1834 |       |       |       [   1   -1    1    0  ]
1835 |       |       |       [   1    1    0    0  ]
1836 |       |       |       [   1    0    0    1  ]
1837 |       |       |       
1838 |       |       Stride: 1
1839 |       |       |       
1840 |       |       +-- Null CloogBlock
1841 |       |       |       
1842 |       |       +-- CloogLoop
1843 |       |       |       |       
1844 |       |       |       +-- CloogDomain
1845 |       |       |       |       [   1    0    1    0    0  ]
1846 |       |       |       |       [   1    0   -1    1    0  ]
1847 |       |       |       |       [   1    0    0    0    1  ]
1848 |       |       |       |       
1849 |       |       |       Stride: 1
1850 |       |       |       |       
1851 |       |       |       +-- Null CloogBlock
1852 |       |       |       |       
1853 |       |       |       +-- CloogLoop
1854 |       |       |       |       |       
1855 |       |       |       |       +-- CloogDomain
1856 |       |       |       |       |       [   1    0    0    0    1  ]
1857 |       |       |       |       |       
1858 |       |       |       |       Stride: 1
1859 |       |       |       |       |       
1860 |       |       |       |       +-- CloogBlock
1861 |       |       |       |       |       |       
1862 |       |       |       |       |       +-- CloogStatement 1 
1863 |       |       |       |       |       |          |   
1864 |       |       |       |       |       |          V   
1865 |       |       |       |       |       |   CloogStatement 2 
1866 |       |       |       |       |       |       
1867 |       |       |       |       |       +-- Null scattering function
1868 |       |       |       |       |       |       
1869 |       |       |       |       |       Depth: 2
1870 |       |       |       |       |       
1871 |       |       |       |       
1872 |       |       |       V
1873 |       |       |   CloogLoop
1874 |       |       |       |       
1875 |       |       |       +-- CloogDomain
1876 |       |       |       |       [   1    0   -1    2    0  ]
1877 |       |       |       |       [   1    0    1   -1   -1  ]
1878 |       |       |       |       [   1    0    0    0    1  ]
1879 |       |       |       |       
1880 |       |       |       Stride: 1
1881 |       |       |       |       
1882 |       |       |       +-- Null CloogBlock
1883 |       |       |       |       
1884 |       |       |       +-- CloogLoop
1885 |       |       |       |       |       
1886 |       |       |       |       +-- CloogDomain
1887 |       |       |       |       |       [   1    0    0    0    1  ]
1888 |       |       |       |       |       
1889 |       |       |       |       Stride: 1
1890 |       |       |       |       |       
1891 |       |       |       |       +-- CloogBlock
1892 |       |       |       |       |       |       
1893 |       |       |       |       |       +-- CloogStatement 3 
1894 |       |       |       |       |       |       
1895 |       |       |       |       |       +-- Null scattering function
1896 |       |       |       |       |       |       
1897 |       |       |       |       |       Depth: 2
1898 |       |       |       |       |       
1899 |       |       |       |       
1900 |       |       |       
1901 |       |       
1902 |       
1903 @end smallexample
1906 @node CloogOptions
1907 @subsection CloogOptions
1908 @example
1909 @group
1910 struct cloogoptions
1911 @{ int l ;                     /* -l option.          */
1912   int f ;                     /* -f option.          */
1913   int strides ;               /* -strides option.    */
1914   int sh ;                    /* -sh option.         */
1915   int esp ;                   /* -esp option.        */
1916   int csp ;                   /* -csp option.        */
1917   int fsp ;                   /* -fsp option.        */
1918   int otl ;                   /* -otl option.        */
1919   int block ;                 /* -block option.      */
1920   int cpp ;                   /* -cpp option.        */
1921   int compilable ;            /* -compilable option. */
1922 @} ;
1923 typedef struct cloogoptions CloogOptions ;
1924 @end group
1925 @end example
1927 @noindent The @code{CloogOptions} structure contains all the possible options to
1928 rule CLooG's behaviour (@pxref{Calling CLooG}).
1929 As a reminder, the default values are:
1930 @itemize @bullet
1931 @item @math{l = -1} (optimize control until the innermost loops),
1932 @item @math{f = 1} (optimize control from the outermost loops),
1933 @item @math{strides = 0} (use only unit strides),
1934 @item @math{sh = 0} (do not simplify convex hulls),
1935 @item @math{esp = 0} (do not spread complex equalities),
1936 @item @math{csp = 1} (spread constant values),
1937 @item @math{fsp = 1} (start to spread from the first iterators),
1938 @item @math{otl = 1} (simplify loops running only once).
1939 @item @math{block = 0} (do not make statement blocks when not necessary).
1940 @item @math{cpp = 0} (do not generate a compilable part of code using preprocessor).
1941 @item @math{compilable = 0} (do not generate a compilable code).
1942 @end itemize 
1945 @node CLooG Functions
1946 @section CLooG Functions Description
1948 @menu
1949 * cloog_program_generate::
1950 * cloog_program_scatter::
1951 * cloog_program_pprint::
1952 * cloog_program_read::
1953 * From Matrices to Domains and Conversely::
1954 * Allocation and Initialization Functions::
1955 * Memory Deallocation Functions::
1956 * Printing Functions::
1957 @end menu
1960 @node cloog_program_generate
1961 @subsection cloog_program_generate
1962 @example
1963 @group
1964 CloogProgram   * cloog_program_generate
1965 ( CloogProgram * program,       /* Input program. */
1966   CloogOptions * options        /* Options. */
1967 ) ;
1968 @end group
1969 @end example
1971 @noindent The @code{cloog_program_generate} function generates
1972 the data structure of the source code that scans the input
1973 polyhedra pointed by @code{program}
1974 according to the options pointed by @code{options}.
1975 The process is made directly on the input structure pointed by
1976 @code{program}, thus the original structure is no longer available
1977 after a call to this function. It returns a pointer to a
1978 @code{CloogProgram} structure containing the
1979 solution in CLooG structures.
1981 The input @code{CloogProgram} structure must have only one loop level
1982 (no inner loops): there is one loop per statement block. For a given block,
1983 the corresponding loop carries the iteration domain, the statement block,
1984 and a loop stride initialized to 1. For instance, the input @code{CloogProgram} structure
1985 that have been sent to @code{cloog_program_generate} to achieve the final
1986 structure and code shown as example in the @code{CloogProgram} structure
1987 description (@pxref{CloogProgram}) was the following one:
1989 @smallexample
1990 +-- CloogProgram
1991 |       |       
1992 |       Language: c
1993 |       |       
1994 |       Scattering dimension number: 0
1995 |       |       
1996 |       +-- CloogNames
1997 |       |       |       
1998 |       |       Scattering dimension number: 0
1999 |       |       |       
2000 |       |       +-- No scattering string
2001 |       |       |       
2002 |       |       Iterator number -----------: 2
2003 |       |       |       
2004 |       |       +-- Iterator strings ------: i j
2005 |       |       |       
2006 |       |       Parameter number ----------: 1
2007 |       |       |       
2008 |       |       +-- Parameter strings -----: n
2009 |       |       
2010 |       +-- Context
2011 |       |       [    1     1    -2  ]
2012 |       |       
2013 |       +-- CloogLoop
2014 |       |       |       
2015 |       |       +-- CloogDomain
2016 |       |       |       [    1     1     0     0     0  ]
2017 |       |       |       [    1    -1     0     1     0  ]
2018 |       |       |       [    1     0     1     0     0  ]
2019 |       |       |       [    1     0    -1     1     0  ]
2020 |       |       |       
2021 |       |       Stride: 1
2022 |       |       |       
2023 |       |       +-- CloogBlock
2024 |       |       |       |       
2025 |       |       |       +-- CloogStatement 1 
2026 |       |       |       |          |
2027 |       |       |       |          V
2028 |       |       |       |   CloogStatement 2 
2029 |       |       |       |       
2030 |       |       |       +-- Null scattering function
2031 |       |       |       |       
2032 |       |       |       Depth: 2
2033 |       |       |       
2034 |       |       V
2035 |       |   CloogLoop
2036 |       |       |       
2037 |       |       +-- CloogDomain
2038 |       |       |       [    1     1     0     0     0  ]
2039 |       |       |       [    1    -1     0     1     0  ]
2040 |       |       |       [    1     0     1    -1    -1  ]
2041 |       |       |       [    1     0    -1     2     0  ]
2042 |       |       |       
2043 |       |       Stride: 1
2044 |       |       |       
2045 |       |       +-- CloogBlock
2046 |       |       |       |       
2047 |       |       |       +-- CloogStatement 3 
2048 |       |       |       |       
2049 |       |       |       +-- Null scattering function
2050 |       |       |       |       
2051 |       |       |       Depth: 2
2052 |       |       |       
2053 |       |       
2054 |       
2055 @end smallexample
2058 @node cloog_program_pprint
2059 @subsection cloog_program_pprint
2060 @example
2061 @group
2062 void cloog_program_pprint
2063 ( FILE * file,                  /* Output file. */
2064   CloogProgram * program,       /* Program to print. */
2065   CloogOptions * options        /* Options. */
2066 ) ;
2067 @end group
2068 @end example
2070 @noindent The function @code{cloog_program_pprint} is a pretty printer for
2071 @code{CloogProgram} structures when it is a solution provided by
2072 the @code{cloog_program_generate} function. It prints the code or pseudo-code in the
2073 file pointed by @code{file} (possibly @code{stdout}) with regards to the
2074 options pointed by @code{options}.
2077 @node cloog_program_scatter
2078 @subsection cloog_program_scatter
2079 @example
2080 @group
2081 void cloog_program_scatter
2082 ( CloogProgram * program,       /* Input program. */
2083   CloogDomainList * scattering, /* Additional scattering functions. */
2084   char ** names ;               /* Additional dimension names. */
2085 ) ;
2086 @end group
2087 @end example
2089 @noindent The function @code{cloog_program_scatter} applies scattering
2090 functions to the @code{CloogProgram} structure pointed by @code{program}.
2091 Original domains of @code{program} are freed. Scattering functions
2092 are inside the @code{CloogDomainList} structure pointed by @code{scattering}.
2093 There must be as many scattering functions in the @code{CloogDomainList}
2094 structure as loops (i.e. iteration domains) in the @code{CloogProgram}
2095 structure. The first scattering function of the list will be applied to the
2096 iteration domain of the first loop in the program, and so on.
2097 @code{names} gives the scattering dimension names as an array of strings. If
2098 @code{names} is @code{NULL}, names are automatically generated: the name of
2099 the @math{n^{th}} scattering dimension will be @code{cn}.
2102 @node cloog_program_read
2103 @subsection cloog_program_read
2104 @example
2105 CloogProgram * cloog_program_read(FILE *) ;
2106 @end example
2107 @noindent The @code{cloog_program_read} function
2108 reads the program data from a CLooG input file
2109 (@pxref{Writing The Input File}). It takes
2110 as input a pointer to the file it has to read (possibly @code{stdin}), and
2111 return a pointer to the read @code{CloogProgram} structure.
2114 @node From Matrices to Domains and Conversely
2115 @subsection From Matrices to Domains and Conversely
2116 @example
2117 CloogMatrix * cloog_domain_domain2matrix(CloogDomain *) ;
2118 CloogDomain * cloog_domain_matrix2domain(CloogMatrix *) ;
2119 @end example
2120 @noindent Two functions are provided to translate a @code{CloogDomain}
2121 data structure to a @code{CloogMatrix} data structure and conversely.
2122 Each function takes as input a pointer to the data structure to translate
2123 and returns as output a pointer to the translated data structure. The
2124 input data structure if neither modified nor freed. They
2125 may be quite useful for e.g. pretty printing since it is more convenient
2126 in constraint (matrix) representation.
2129 @node Allocation and Initialization Functions
2130 @subsection Allocation and Initialization Functions
2131 @example
2132 CloogStructure * cloog_structure_malloc() ;
2133 @end example
2134 @noindent Each CLooG data structure has an allocation and initialization
2135 function as shown above, where @code{Structure} and @code{structure} have to
2136 be replaced by the name of the convenient structure (without @samp{Cloog} prefix) for
2137 instance @code{CloogLoop * cloog_loop_malloc() ;}. These functions return
2138 pointers to an allocated structure with fields set to convenient default
2139 values. @strong{Using those functions is mandatory} to support internal
2140 management fields and to avoid upward compatibility problems if
2141 new fields appear. An exception is @code{cloog_matrix_malloc} since the
2142 @code{CloogMatrix} comes directly from the PolyLib. It takes two parameters:
2143 the number of rows and columns of the matrix we want to allocate:
2144 @example
2145 CloogMatrix * cloog_matrix_malloc(unsigned nbrows, unsigned nbcolumns);
2146 @end example
2149 @node Memory Deallocation Functions
2150 @subsection Memory Deallocation Functions
2151 @example
2152 void cloog_structure_free(CloogStructure *) ;
2153 @end example
2154 @noindent Each CLooG data structure has a deallocation function as shown above,
2155  where @code{Structure} and @code{structure} have to
2156 be replaced by the name of the convenient structure (without @samp{Cloog} prefix) for
2157 instance @code{void cloog_loop_free(CloogLoop *) ;}. These functions
2158 free the allocated memory for the structure provided as input. They free
2159 memory recursively, i.e. they also free the allocated memory for the internal
2160 structures.
2161 @strong{Using those functions is mandatory} to avoid memory leaks on internal
2162 management fields and to avoid upward compatibility problems if
2163 new fields appear.
2166 @node Printing Functions
2167 @subsection Printing Functions
2168 @example
2169 void cloog_structure_print(FILE *, CloogStructure *) ;
2170 @end example
2171 @noindent Each CLooG data structure has a printing function as shown above,
2172  where @code{Structure} and @code{structure} have to
2173 be replaced by the name of the convenient structure (without @samp{Cloog} prefix) for
2174 instance @code{void cloog_loop_print(FILE *, CloogLoop *) ;}. These functions
2175 print the pointed structure (and its fields recursively) to the file provided
2176 as input (possibly @code{stdout}).
2179 @node Example of Library Utilization
2180 @section Example of Library Utilization
2181 Here is a basic example showing how it is possible to use the CLooG library,
2182 assuming that a standard installation has been done.
2183 The following C program reads a CLooG input file on the standard input,
2184 then prints the solution on the standard output.
2185 Options are preselected to the default values of the CLooG software.
2186 This example is provided in the @code{example} directory of the
2187 CLooG distribution.
2188 @example
2189 /* example.c */
2190 # include <stdio.h>
2191 # include <cloog/cloog.h>
2193 int main()
2194 @{ CloogProgram * program ;
2195   CloogOptions * options ;
2196   
2197   /* Setting options and reading program informations. */
2198   options = cloog_options_malloc() ;
2199   program = cloog_program_read(stdin,options) ;
2201   /* Generating and printing the code. */
2202   program = cloog_program_generate(program,options) ;
2203   cloog_program_pprint(stdout,program,options) ;
2205   cloog_options_free(options) ;
2206   cloog_program_free(program) ;
2207   return 0;
2209 @end example
2211 @noindent The compilation command could be:
2212 @example
2213 gcc example.c -lcloog -o example
2214 @end example
2215 @noindent A calling command with the input file test.cloog could be:
2216 @example
2217 more test.cloog | ./example
2218 @end example
2221 @c %  ******************************** HACKING *********************************
2222 @c @node Hacking
2223 @c @chapter Hacking CLooG
2225 @c @menu
2226 @c * Program organization::
2227 @c * Special Options::
2228 @c * CLooG Coding Standards::
2229 @c @end menu
2231 @c @node Program organization
2232 @c @section Program organization
2234 @c @node Special Options
2235 @c @section Special Options
2237 @c @node CLooG Coding Standards
2238 @c @section CLooG Coding Standards
2241 @c %  ****************************** INSTALLING ********************************
2242 @node Installing
2243 @chapter Installing CLooG
2245 @menu
2246 * License::
2247 * Requirements::
2248 * Basic Installation::
2249 * Optional Features::
2250 * Uninstallation::
2251 @end menu
2253 @node License
2254 @section License
2255 First of all, it would be very kind to refer the following paper in any
2256 publication that result from the use of the CLooG software or its library,
2257 @pxref{Bas04} (a bibtex entry is provided behind the title page of this
2258 manual, along with copyright notice, and in the CLooG home
2259 @code{http://www.CLooG.org}.
2261 This program is free software; you can redistribute it and/or
2262 modify it under the terms of the GNU General Public License version 2
2263 as published by the Free Software Foundation.
2264 This program is distributed in the hope that it will be useful,
2265 but WITHOUT ANY WARRANTY; without even the implied warranty of
2266 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2267 GNU General Public License for more details.
2268 @code{http://www.gnu.org/copyleft/gpl.html}
2271 @node Requirements
2272 @section Requirements
2274 @menu
2275 * PolyLib::
2276 * GMP Library::
2277 @end menu
2280 @node PolyLib
2281 @subsection PolyLib (mandatory)
2282 To successfully install CLooG, the user need firstly to install PolyLib
2283 version 5.22.1 or above (default 64 bits version is satisfying
2284 as well as 32 bits or GMP multiple precision version).
2285 Polylib can be downloaded freely
2286 at @code{http://icps.u-strasbg.fr/PolyLib/} or
2287 @code{http://www.irisa.fr/polylib/}. Once downloaded and unpacked
2288 (e.g. using the @samp{tar -zxvf polylib-5.22.1.tar.gz} command),
2289 the user can compile
2290 it by typing the following commands on the PolyLib's root directory:
2292 @itemize @bullet
2293 @item @code{./configure}
2294 @item @code{make}
2295 @item And as root: @code{make install}
2296 @end itemize
2298 The PolyLib default installation is @code{/usr/local}. This directory may
2299 not be inside your library path. To fix the problem, the user should set
2300 @example
2301 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
2302 @end example
2303 @noindent if your shell is, e.g., bash or
2304 @example
2305 setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib
2306 @end example
2307 @noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or
2308 whatever convenient file) to make this change permanent. Another solution
2309 is to ask PolyLib to install in the standard path by using the prefix
2310 option of the configure script:
2311 @samp{./configure --prefix=/usr}.
2313 CLooG makes intensive calls to polyhedral operations, and PolyLib
2314 functions do the job. Polylib is a free library written in C for the
2315 manipulation of polyhedra. The library is operating on objects like
2316 vectors, matrices, lattices, polyhedra, Z-polyhedra, unions of
2317 polyhedra and a lot of other intermediary structures. It provides
2318 functions for all the important operations on these structures. 
2320 @node GMP Library
2321 @subsection GMP Library (optional)
2323 To be able to deal with insanely large coefficient, the user will need to
2324 install the GNU Multiple Precision Library (GMP for short) version 4.1.4
2325 or above. It can be freely downloaded from @code{http://www.swox.com/gmp}.
2326 The user can compile it by typing the following commands on the GMP root
2327 directory:
2329 @itemize @bullet
2330 @item @code{./configure}
2331 @item @code{make}
2332 @item And as root: @code{make install}
2333 @end itemize
2335 The GMP default installation is @code{/usr/local}, the same method to
2336 fix a library path problem applies as with PolyLib (@pxref{PolyLib}).
2338 The PolyLib has to be built using the GMP library by specifying the option
2339 @samp{--with-libgmp=PATH_TO_GMP} to the PolyLib configure script
2340 (where @code{PATH_TO_GMP} is @code{/usr/local} if you did not change the GMP
2341 installation directory). Then you have to set the convenient CLooG configure
2342 script options to buid the GMP version (@pxref{Optional Features}).
2345 @node Basic Installation
2346 @section CLooG Basic Installation
2348 Once downloaded and unpacked
2349 (e.g. using the @samp{tar -zxvf cloog-@value{VERSION}.tar.gz} command),
2350 you can compile CLooG by typing the following commands on the CLooG's root
2351 directory:
2353 @itemize @bullet
2354 @item @code{./configure}
2355 @item @code{make}
2356 @item And as root: @code{make install}
2357 @end itemize
2359 Depending on the location of the PolyLib, you may need to set the
2360 option @code{--with-polylib} of the configure script
2361 (e.g. @samp{./configure --with-polylib=/usr/local} with a default PolyLib
2362 installation).
2364 The program binaries and object files can be removed from the
2365 source code directory by typing @code{make clean}. To also remove the
2366 files that the @code{configure} script created (so you can compile the
2367 package for a different kind of computer) type @code{make distclean}.
2369 Both the CLooG software and library have been successfully compiled
2370 on the following systems:
2371 @itemize @bullet
2372 @item PC's under Linux, with the @code{gcc} compiler,
2373 @item PC's under Windows (Cygwin), with the @code{gcc} compiler,
2374 @item Sparc and UltraSparc Stations, with the @code{gcc} compiler.
2375 @end itemize
2377 @node Optional Features 
2378 @section Optional Features  
2379 The @code{configure} shell script attempts to guess correct values for
2380 various system-dependent variables and user options used during compilation.
2381 It uses those values to create the @code{Makefile}. Various user options
2382 are provided by the CLooG's configure script. They are summarized in the
2383 following list and may be printed by typing @code{./configure --help} in the
2384 CLooG top-level directory.
2386 @itemize @bullet
2387 @item By default, the installation directory is @code{/usr/local}:
2388 @code{make install} will install the package's files in
2389 @code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}.
2390 The user can specify an installation prefix other than @code{/usr/local} by
2391 giving @code{configure} the option @code{--prefix=PATH}.
2393 @item By default, @code{configure} will look for the PolyLib in standard
2394 locations. If necessary, the user can specify the PolyLib path by giving
2395 @code{configure} the option @code{--with-polylib=PATH}.
2397 @item By default, both CLooG software and library are compiled and installed.
2398 By giving  @code{configure} the option @code{--without-cloog} the user
2399 disable the compilation and installation of the CLooG software.
2400 By giving @code{configure} the option
2401 @code{--without-lib} the user disable the compilation and installation of the
2402 CLooG library.
2404 @item By default, CLooG is built in 64bits version if such version of the
2405 PolyLib is found by @code{configure}. If the only existing version of the
2406 PolyLib is the 32bits or if the user give to @code{configure} the option
2407 @code{--with-bits=32}, the 32bits version of CLooG will be compiled. In the
2408 same way, the option @code{--with-bits=gmp} have to be used to build
2409 the multiple precision version.
2411 @item By default, @code{configure} will look for the GMP library
2412 (necessary to build the multiple precision version) in standard
2413 locations. If necessary, the user can specify the GMP path by giving
2414 @code{configure} the option @code{--with-gmp=PATH}.
2415 @end itemize
2417 @node Uninstallation 
2418 @section Uninstallation  
2419 The user can easily remove the CLooG software and library from his system
2420 by typing (as root if necessary) from the CLooG top-level directory
2421 @code{make uninstall}.
2423 @c %  **************************** DOCUMENTATION ******************************
2424 @node Documentation
2425 @chapter Documentation
2426 The CLooG distribution provides several documentation sources. First, the
2427 source code itself is as documented as possible. The code comments use a
2428 Doxygen-compatible presentation (something similar to what JavaDoc does for
2429 JAVA). The user may install Doxygen
2430 (see @code{http://www.stack.nl/~dimitri/doxygen}) to automatically
2431 generate a technical documentation by typing @code{make doc} or
2432 @code{doxygen ./autoconf/Doxyfile} at the CLooG top-level directory after
2433 running the configure script (@pxref{Installing}). Doxygen will generate
2434 documentation sources (in HTML, LaTeX and man) in the @code{doc/source}
2435 directory of the CLooG distribution.
2437 The Texinfo sources of the present document are also provided in the @code{doc}
2438 directory. You can build it in either DVI format (by typing
2439 @code{texi2dvi cloog.texi}) or PDF format
2440 (by typing @code{texi2pdf cloog.texi}) or HTML format
2441 (by typing @code{makeinfo --html cloog.texi}, using @code{--no-split}
2442 option to generate a single HTML file) or info format
2443 (by typing @code{makeinfo cloog.texi}).
2445 @c %  ****************************** REFERENCES ********************************
2446 @node References
2447 @chapter References
2449 @itemize
2450 @item
2451 @anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality
2452 by chunking. CC'12 International Conference on Compiler Construction,
2453 LNCS 2622, pages 320-335, Warsaw, april 2003. 
2455 @item
2456 @anchor{Bas03b}[Bas03b] C. Bastoul. Efficient code generation for automatic
2457 parallelization and optimization. ISPDC'03 IEEE International Symposium on
2458 Parallel and Distributed Computing, pages 23-30, Ljubljana, october 2003. 
2460 @item
2461 @anchor{Bas04}[Bas04] C. Bastoul. Code Generation in the Polyhedral Model
2462 Is Easier Than You Think. PACT'13 IEEE International Conference on Parallel
2463 Architecture and Compilation Techniques, pages 7-16, Juan-les-Pins,
2464 september 2004.
2466 @item
2467 @anchor{Fea92}[Fea92] P. Feautrier Some efficient solutions to the affine
2468 scheduling problem, part II: multidimensional time.
2469 International Journal of Parallel Programming, 21(6):389--420, December 1992.
2471 @item
2472 @anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs
2473 for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur
2474 Mathematik und Informatik, Universit@"at Passau, 2004.
2475 @emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/}
2477 @item
2478 @anchor{Qui00}[Qui00] F. Quiller@'e, S. Rajopadhye, and D. Wilde.
2479 Generation of efficient nested loops from polyhedra.
2480 International Journal of Parallel Programming, 28(5):469-498,
2481 october 2000.
2483 @item
2484 @anchor{Wil93}[Wil93] Doran K. Wilde.
2485 A library for doing polyhedral operations.
2486 Technical Report 785, IRISA, Rennes, France, 1993.
2488 @end itemize
2493 @c % /*************************************************************************
2494 @c %  *                       PART VI: END OF THE DOCUMENT                    *
2495 @c %  *************************************************************************/
2496 @c @unnumbered Index
2497      
2498 @c @printindex cp
2499      
2500 @bye