LNO man page on IRIX

Man page or keyword search:  
man Server   31559 pages
apropos Keyword Search (all sections)
Output format
IRIX logo
[printable version]

LNO(5)						      Last changed: 3-10-98

NAME
     LNO - Compiler loop nest optimization option group

SYNOPSIS
     -LNO: ...

IMPLEMENTATION
     IRIX systems

DESCRIPTION
     This man page describes the loop nest optimization options accepted by
     the f90(1), f77(1), CC(1), cc(1), and c89(1) commands.

     The -LNO: option group specifies options and transformations performed
     on loop nests.  The -LNO: option group is enabled only if the -O3
     option is also specified on the compiler command line.

     For information on the LNO options that are in effect during a
     compilation, use the -LIST:options=ON option.

     You can specify more than one suboption to the -LNO: option either by
     using colons to separate each suboption or by specifying multiple
     options on the command line.  For example, the following command lines
     are equivalent:

	  f90 -LNO:auto_dist=ON:outer=OFF b.f
	  f90 -LNO:auto_dist=ON -LNO:outer=OFF b.f

     Some -LNO: suboptions are specified with a setting that either enables
     or disables the feature.  To enable a feature, specify the argument
     either alone or with =1, =ON, or =TRUE.  To disable a feature, specify
     the suboption with either =0, =OFF, or =FALSE.  For example, the
     following command lines are equivalent:

	  f90 -LNO:auto_dist:blocking=OFF:oinvar=FALSE a.f
	  f90 -LNO:auto_dist=1:blocking=0:oinvar=OFF a.f

     For brevity, this man page shows only the ON or OFF settings to
     suboptions, but 0, 1, TRUE, and FALSE are also allowed as settings. In
     addition, this man page shows the abbreviated form for some of the
     suboption names.  You can use either the abbreviation or the complete
     suboption name when using the suboptions. The following is a list of
     the abbreviations and the complete suboption names:

	  Complete name			Abbreviation

	  outer_unroll			ou

	  associativity			assoc

	  clean_miss_penalty		cmp

	  dirty_miss_penalty		dmp

	  cache_size			cs

	  is_memory_level		is_mem

	  line_size			ls

	  tlb_entries			tlb

	  tlb_clean_miss_penalty	tlbcmp

	  prefetch_level		pf

     See "F77 LNO Directives" at the end of this man page for a summary of
     the F77 directives for LNO.  See the MIPSPro 7 Fortran 90 Commands and
     Directives Reference Manual, publication SR-3907, for a discussion of
     the Fortran 90 LNO directives.  See MIPSpro C and C++ Pragmas, for
     descriptions of the C and C++ LNO #pragma directives.

     The descriptions to the suboptions to -LNO: are divided into the
     following categories:

	       * General options

	       * Transformation options

	       * Cache memory management options

	       * TLB options

	       * Prefetch options

     The -LNO option accepts the following general suboptions:

     Suboption	 Action

     auto_dist[ = ( ON|OFF )]
		 Distributes local arrays in common blocks that are
		 accessed in parallel.	The default is OFF.

		 This optimization works with either automatic parallelism
		 or parallelism using directives; it is always safe, and
		 does not affect the layout of arrays in virtual space, and
		 does not incur addressing overhead.

     fission=n	 Controls loop fission.	 n can be one of the following:

		 0   Disables loop fission.

		 1   Performs normal fission as necessary.  This is the
		     default.

		 2   Specifies that fission be tried before fusion.

		 If -LNO:fission=n and -LNO:fusion=n are both set to 1 or
		 to 2, fusion is performed.

     fusion=n	 Controls loop fusion.	n can be one of the following:

		 0   Disables loop fusion.

		 1   Performs standard outer loop fusion.  This is the
		     default.

		 2   Specifies that outer loops should be fused, even if it
		     means partial fusion.

		 The compiler attempts fusion before fission.  The compiler
		 performs partial fusion if not all levels can be fused in
		 the multiple-level fusion.

		 If -LNO=fission=n and -LNO:fusion=n are both set to 1 or
		 to 2, fusion is performed.

     fusion_peeling_limit=n
		 Sets the limit for the number of iterations allowed to be
		 peeled in fusion, where n >= 0.  By default, n=5.

     gather_scatter=n
		 Performs gather-scatter optimizations.	 n can be one of
		 the following:

		 0   Disables all gather-scatter optimization.

		 1   Performs gather-scatter optimizations on non-nested IF
		     statements.  This is the default.

		 2   Performs multi-level gather-scatter optimizations.

     ignore_pragmas[ = ( ON|OFF )]
		 Specifies that the command line options override
		 directives in the source file.	 The default is OFF.

     non_blocking_loads[ = ( ON|OFF )]
		 (C/C++ and F77 only) Specifies whether the processor
		 blocks on loads.  If not set, the default of the current
		 processor is used.

     oinvar[ = ( ON|OFF )]
		 Controls outer loop hoisting.	The default is ON.

     opt=n	 Controls the LNO optimization level.  n can be one of the
		 following:

		 0   Disables nearly all loop nest optimization.

		 1   Peforms full loop nest transformations.  This is the
		     default.

     outer[ = ( ON|OFF )]
		 Enables or disables outer loop fusion.	 The default is ON.

     vintr[ = ( ON|OFF )]
		 Specifies that vectorizable versions of the math intrinsic
		 functions should be used.  The default is ON.

		 For information on the math intrinsic functions, see
		 math(3M).

     The loop transformation arguments allow you to control cache blocking,
     loop unrolling, and loop interchange.  They are as follows:

     blocking[ = ( ON|OFF )]
	       Specify blocking=OFF to disable the cache blocking
	       transformation.	The default is ON.

     blocking_size=[n1][,n2]
	       Specifies a block size that the compiler must use when
	       performing any blocking.	 When using the MIPSpro 7 Fortran
	       90 compiler, specify a value for n2 when using a 2-level
	       cache.  For n1 or n2, specify a positive integer number that
	       represents the number of iterations.

     interchange[ = ( ON|OFF )]
	       Specifies whether or not loop interchange optimizations are
	       performed.  The default is ON.

     ou=n      Indicates that all outer loops for which unrolling is legal
	       should be unrolled by n, where n is a positive integer.	The
	       compiler unrolls loops by this amount or not at all.

     ou_deep[ = ( ON|OFF )]
	       Specifies that for loops with 3-deep, or deeper, loop nests,
	       the compiler should outer unroll the wind-down loops that
	       result from outer unrolling loops further out.  This results
	       in large code size, but it generates much faster code
	       whenever wind-down loop execution costs are important.  The
	       default is ON.

     ou_further=n
	       Specifies whether or not the compiler performs outer loop
	       unrolling on wind-down loops.  Specify an integer for n.

     ou_max=n  Indicates that the compiler can unroll as many as n copies
	       per loop, but no more.

     ou_prod_max=n
	       Indicates that the product of unrolling of the various outer
	       loops in a given loop nest is not to exceed n, where n is a
	       positive integer.  The default is 16.

     pwr2[ = ( ON|OFF )]
	       (C/C++ and F77 only) Specifies whether to ignore the leading
	       dimension (set to OFF to ignore).

	       You can disable additional unrolling by specifying
	       -LNO:ou_further=999999.	Unrolling is enabled as much as is
	       sensible by specifying -LNO:ou_further=3.

     Certain arguments allow you to describe the target cache memory
     system.  The numbering in the following arguments starts with the
     cache level closest to the processor and works outward:

     assoc1=n, assoc2=n, assoc3=n, assoc4=n
	       Specifies the cache set associativity.  For a fully
	       associative cache, such as main memory, set n to any
	       sufficiently large number, such as 128.	Specify a positive
	       integer for n.  Specifying n=0 indicates that there is no
	       cache at that level.

     cmp1=n, cmp2=n, cmp3=n, cmp4=n
     dmp1=n, dmp2=n, dmp3=n, dmp4=n
	       Specifies, in processor cycles, the time for a clean miss
	       (cmpx=) or dirty miss (dmpx=) to the next outer level of the
	       memory hierarchy.  This number is approximate because it
	       depends upon a clean or dirty line, read or write miss, etc.
	       Specify a positive integer for n.  Specifying n=0 indicates
	       that there is no cache at that level.

     cs1=n, cs2=n, cs3=n, cs4=n
	       Specifies the cache size.  The value n can be 0, or it can
	       be a positive integer followed by one of the following
	       letters:	 k, K, m, or M.	 This specifies the cache size in
	       Kbytes or Mbytes.  Specifying 0 indicates that there is no
	       cache at that level.

	       The default cache size depends on your system.  You can use
	       the -LIST:options=ON option to see the default cache sizes
	       used during your compilation.

     is_mem1[ = ( ON|OFF )]
     is_mem2[ = ( ON|OFF )]
     is_mem3[ = ( ON|OFF )]
     is_mem4[ = ( ON|OFF )]
	       Specifies that certain memory hierarchies should be modeled
	       as memory, not cache.  The default is OFF for each option.

	       Blocking can be attempted for this memory hierarchy level,
	       and blocking appropriate for memory, rather than cache, is
	       applied.	 No prefetching is performed, and any prefetching
	       options are ignored.  If an -OPT:is_memx[ = ( ON|OFF )]
	       option is specified, the corresponding assocx=n
	       specification is ignored, any cmpx=n and dmpx=n options on
	       the command line are ignored.

     ls1=n, ls2=n, ls3=n, ls4=n
	       Specifies the line size, in bytes.  This is the number of
	       bytes, specified in the form of a positive integer number,
	       n, that are moved from the memory hierarchy level further
	       out to this level on a miss.  Specifying n=0 indicates that
	       there is no cache at that level.

     Certain arguments control the TLB.	 The TLB is a cache for the page
     table, and it is assumed to be fully associative.	The TLB control
     arguments are as follows:

     ps1=n, ps2=n, ps3=n, ps4=n
	       Specifies the number of bytes in a page.	 Specify a positive
	       integer for n.  The default n depends on your system
	       hardware.

     tlb1=n, tlb2=n, tlb3=n, tlb4=n
	       Specifies the number of entries in the TLB for this cache
	       level.  Specify a positive integer for n.  The default n
	       depends on your system hardware.

     tlbcmp1=n, tlbcmp2=n, tlbcmp3=n, tlbcmp4=n
     tlbdmp1=n, tlbdmp2=n, tlbdmp3=n, tlbdmp4=n
	       Specifies the number of processor cycles it takes to service
	       a clean TLB miss (the tlbcmpx= options) or dirty TLB miss
	       (the tlbdmpn= options).	Specify a positive integer for n.
	       The default n depends on your system hardware.

     The following arguments control the prefetch operation:

     pf1[ = ( ON|OFF )]
     pf2[ = ( ON|OFF )]
     pf3[ = ( ON|OFF )]
     pf4[ = ( ON|OFF )]
	       Selectively disables and enables prefetching for cache level
	       x, for pfx[ = ( ON|OFF )]

	       When -r10000 is in effect, pf1=ON and pf2=ON by default.	 At
	       any other -rn setting, OFF is in effect for all cache
	       levels.

     prefetch=n
	       Specifies levels of prefetching.	 n can be one of the
	       following:

	       0   Disables all prefetching.  This is the default when
		   -r4000, -r5000, or -r8000 is in effect.

	       1   Enables conservative prefetching.  This is the default
		   when -r10000 is in effect.

	       2   Enables aggressive prefetching.

     prefetch_ahead=n
	       Prefetches the specified number of cache lines ahead of the
	       reference.  Specify a positive integer for n.  The default
	       is 2.

     prefetch_manual[ = ( ON|OFF )]
	       Specifies whether manual prefetches (through directives)
	       should be respected or ignored.

	       prefetch_manual=OFF ignores manual prefetches.  This is the
	       default when -r8000, -r5000, or -r4000 is in effect.

	       prefetch_manual=ON respects manual prefetches.  This is the
	       default when -r10000 is in effect.

F77 LNO Directives
     Directives within a program unit apply only to that program unit,
     reverting to the default values at the end of the program unit.
     Directives that occur outside of a program unit alter the default
     value, and therefore apply to the rest of the file from that point on,
     until overridden by a subsequent directive.

     Directives within a file override the command line options by default.
     To have the command line options override directives, use the command
     line option:

	  -LNO:ignore_pragmas

   Fission and Fusion Directives
     * C*$* AGGRESSIVE INNER LOOP FISSION: Fission this loop in
       inner_fission phase to as many loops as possible.  This must be
       followed by a inner loop and has no effect if that loop is not inner
       any more after the SNL phase.

     * C*$* FISSION [(n)] or C*$* FISSIONABLE:	Fission the enclosing n
       level of loops after this directive. Perform legality test unless a
       fissionable directive is also specified. Does not re-order
       statements.

     * C*$* FUSE [(n [,level] )] or C*$* FUSABLE:  Fuse the following n
       immediately adjacent loops. Fusion is attempted on each pair of
       adjacent loops and the level, by default, is the determined by the
       maximal SNL levels of the fused loops, although partial fusion is
       allowed.	 Iterations may be peeled as needed during fusion; the
       peeling limit is 5 or the number specified by the
       -LNO:fusion_peeling_limit flag.	When the FUSABLE directive is
       present, no legality test is done and the fusion is done up to the
       maximal SNL levels where the iteration numbers matched for each pair
       of loops to be matched.	The default value for n is  2.

     * C*$* NO FISSION:	 The loop following this directive should not be
       fissioned in either fiz_fuse phase or inner_fission phase. Its inner
       loops, however, are allowed to be fissioned.

     * C*$* NO FUSION:	The loop following this directive should not be
       fused with other loops.

   SNL Transformation Directives
     The parallelizing preprocessor may do some transformation for
     parallelism that violate some of these directives.

     * C*$* INTERCHANGE (I, J [,K ...] ):  Loops I, J and K (in any order)
       must directly follow this directive and be perfectly nested inside
       each other. If they are not perfectly nested, the compiler may
       perform loop distribution to make them so, or may ignore the
       annotation, or may apply imperfect interchange (this is not likely).
       The compiler attempts to reorder loops so that I is outermost, then
       J, then K.  The compiler may ignore this directive.  There must be a
       minimum of 2 indexes in the directive.

     * C*$* NO INTERCHANGE:  Prevents the compiler from involving the loop
       directly following this directive in a permutation, or any loop
       nested within this loop.

     * C*$* BLOCKING SIZE (n1,n2) or C*$* BLOCKING SIZE (n1) or C*$*
       BLOCKING SIZE (,n2): If the specified loop is involved in a blocking
       for the primary or secondary cache, it will have a blocksize of n1
       or n2. The compiler will try to include this loop within such a
       block.  If a blocking size is specified as 0, the loop is not
       actually stripped, but the entire loop is inside the block.

     * C*$* NO BLOCKING: Prevent the compiler from involving this loop in a
       cache blocking.

     * C*$* UNROLL (n [,n2] ): This directive suggests that n-1 copies of
       the loop body be added to the inner loop. If the loop that this
       directive directly preceeds is an inner loop, then it indicates
       standard unrolling. If the loop that this directive directly
       preceeds is not innermost, then outer loop unrolling is performed.
       n must be at least 1.  If n=1 then no unrolling will be performed.
       If n=0, then the default unrolling should be applied.  n2 is
       ignored.

     * C*$* BLOCKABLE (I,J [,K ...] ): The I, J and K loops must be
       adjacent and nested within each other, although not necessarily
       perfectly nested.  This directive informs the compiler that these
       loops may legally be involved in a blocking with each other, even if
       the compiler would consider such a transformation illegal.  The
       loops are also interchangeable and unrollable.  This directive does
       not instruct the compiler which of these transformations to apply.
       You must specify at least 2 loop indexes in the directive.

   Prefetch Directives
     * C*$* PREFETCH (n[,n]): Specify prefetching for each level of the
       cache. The scope is the entire function containing the directive.  n
       can be one of the following values:

       0    prefetching off (default for all processors except R10000)

       1    prefetching on, but conservative

       2    prefetching on, and aggressive (default when prefetch is on)

     * C*$* PREFETCH_MANUAL (n):  Specify if manual prefetches (through
       directives) should be respected or ignored.  Scope: Entire function
       containing the directive.  n can be one of the following values:

       0    ignore manual prefetches (default for mips3 and earlier)

       1    respect manual prefetches (default for mips4)

     * C*$* PREFETCH_REF_DISABLE=A [, size=num]:  This directive explicitly
       disables prefetching all references to array A in the current
       function. The auto-prefetcher runs (if enabled) ignoring array A.
       The size is used for volume analysis.  Scope: Entire function
       containing the directive.  size=num is the size of the array
       references in this loop, in Kbytes.  This is an optional argument
       and must be a constant.

     * C*$* PREFETCH_REF=array-ref,[stride=[str] [,str]], [level=[lev]
       [,lev]], [kind=[rd/wr]], [size=[sz]]: This directive generates a
       single prefetch instruction to the specified memory location. It
       searches for array references that match the supplied reference in
       the current loop-nest.  If such a reference is found, that reference
       is connected to this prefetch node with the specified latency. If no
       such reference is found, this prefetch node stays free-floating and
       is scheduled "loosely".

       All references to this array in this loop-nest are ignored by the
       automatic prefetcher (if enabled).

       If the size is supplied, then the auto-prefetcher (if enabled)
       reduces the effective cache size by that amount in its calculations.

       The compiler tries to issue one prefetch per stride iteration, but
       cannot guarantee it. Redundant prefetches are preferred to
       transformations (such as inserting conditionals) which incur other
       overhead.

       Scope: No scope. Just generates a prefetch instruction.

       The following arguments are used with this option:

       array-ref Required.  The reference itself, for example, A(i, j).

       str	 Optional. Prefetch every str iterations of this loop.	The
		 default is 1.

       lev	 Optional.  The level in memory hierarchy to prefetch. The
		 default is 2.	If lev=1, prefetch from L2 to L1 cache. If
		 lev=2, prefetch from memory to L1 cache.

       rd/wr	 Optional.  The default is read/write.

       sz	 Optional.  The size (in Kbytes) of the array referenced in
		 this loop. This must be a constant.

   Dependence Analysis Directives
     * CDIR$ IVDEP: This applies only to inner loops. Liberalize dependence
       analysis.  Given two memory references, where at least one is loop
       variant, ignore any loop-carried dependences between the two
       references. The following are examples of this directive.

	  do i = 1,n
	    b(k) = b(k) + a(i)
	  enddo

     IVDEP does not break the dependence because b(k) is not loop-variant.

	  do i=1,n
	     a(i) = a(i-1) + 3
	  enddo

     IVDEP does break the dependence but the compiler warns the user that
     it is breaking an obvious dependence.

	  do i=1,n
	     a(b(i)) = a(b(i)) + 3.
	  enddo

     IVDEP does break the dependence.

	  do i = 1,n
	     a(i) = b(i)
	     c(i) = a(i) + 3.
	  enddo

     IVDEP does not break the dependence on a[i] because it is within an
     iteration.

     If -OPT:cray_ivdep=ON, Cray semantics are used and all lexically
     backwards dependences are broken. The following are examples:

	  do i=1,n
	     a(i) = a(i-1) + 3.
	  enddo

     IVDEP does break the dependence but the compiler warns the user that
     it's breaking an obvious dependence.

	  do i=1,n
	     a(i) = a(i+1) + 3.
	  enddo

     IVDEP does not break the dependence because the dependence is from the
     load to the store, and the load comes lexically before the store.

     If -OPT:liberal_ivdep=ON, all dependences are broken.

SEE ALSO
     cc(1), CC(1), cord(1), dso(1), f77(1), f90(1), fpmode(1), hinv(1),
     ld(1), make(1), pixie(1), pmake(1), prof(1), rld(1), smake(1).

     math(3M).

     auto_p(5), gp_overflow(5), ipa(5), opt(5), pe_environ(5).

     MIPSpro C and C++ Pragmas, publication 007-3587-001

     C Language Reference Manual, publication 007-0701-120

     Compiler Information File (CIF) Reference Manual, publication SR-2401

     MIPSPro 7 Fortran 90 Commands and Directives Reference Manual,
     publication SR-3907

     This man page is available only online.
[top]

List of man pages available for IRIX

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net