A compiler directive directs the compiler to do some special action. Directives are also called pragmas.
A compiler directive is inserted into the source program as one or more lines of text. Each line looks like a comment, but has additional characters that identify it as more than a comment for this compiler. For most other compilers, it is treated as a comment, so there is some code portability.
Sun-style directives are the default with f90 (and f77). To switch to Cray-style directives, use the -mp=cray compiler command-line flag.
General directives have the following syntax.
!DIR$ d1, d2, ...
A general directive line is defined as follows.
Spaces before, after, or within a directive are ignored.
Letters of a directive line can be in uppercase, lowercase, or mixed.
The form varies for fixed-form and free-form source as follows.
Put CDIR$ or !DIR$ in columns 1 through 5.
Directives are listed in columns 7 and beyond.
Columns beyond 72 are ignored.
An initial directive line has a blank in column 6.
A continuation directive line has a nonblank in column 6.
Put !DIR$ followed by a space anywhere in the line. The !DIR$ characters are the first nonblank characters in the line (actually, non-whitespace).
Directives are listed after the space.
An initial directive line has a blank, tab, or newline in the position immediately after the !DIR$.
A continuation directive line has a character other than a blank, tab, or newline in the position immediately after the !DIR$.
Thus, !DIR$ in columns 1 through 5 works for both free-form source and fixed-form source.
These directives specify the source form of lines following the directive line.
They apply to the rest of the file in which they appear, or until the next FREE or FIXED directive is encountered.
They allow you to switch source forms within a source file.
They allow you to switch source forms for an INCLUDE file. You insert the directive at the start of the INCLUDE file. After the INCLUDE file has been processed, the source form reverts back to the form being used prior to processing the INCLUDE file.
The FREE/FIXED directives:
Each must appear alone on a compiler directive line (not continued).
Each can appear anywhere in your source code. Other directives must appear within the program unit they affect.
!DIR$ FREE DO i = 1, n a(i) = b(i) * c(i) END DO
A parallelization directive is a special comment that directs the compiler to attempt to parallelize the next DO loop. Currently there is only one parallel directive, DOALL.
The DOALL directive tells the compiler to parallelize the next loop it finds, if possible.
Parallel directives have the following syntax.
!MIC$ DOALL [general parameters] [scheduling parameter]
A parallelization directive line is defined as follows.
A parallel directive starts with the CMIC$ or !MIC$, followed by:
A space
A directive
For some directives, one or more parameters
Spaces before, after, or within a directive are ignored.
Letters of a parallelization directive line can be in uppercase, lowercase, or mixed.
The form varies for fixed-form and free-form source as follows.
Put CMIC$ or !MIC$ in columns 1 through 5.
Directives are listed in columns 7 and beyond.
Columns beyond 72 are ignored.
An initial directive line has a blank in column 6.
A continuation directive line has a nonblank in column 6.
Put !MIC$ followed by a space anywhere in the line. The !MIC$ characters are the first nonblank characters in the line (actually, non-whitespace).
Directives are listed after the space.
An initial directive line has a blank, tab, or newline in the position immediately after the !MIC$.
A continuation directive line has a character other than a blank, tab, or newline in the position immediately after the !MIC$.
Thus, !MIC$ in columns 1 through 5 works for both free and fixed.
Example: Directive with continuation lines (DOALL directive and parameters.)
C$PAR DOALL !MIC$& SHARED( a, b, c, n ) !MIC$& PRIVATE( i ) DO i = 1, n a(i) = b(i) * c(i) END DO
Example: Same directive and parameters, with no continuation lines.
C$PAR DOALL SHARED( a, b, c, n ) PRIVATE( i ) DO i = 1, n a(i) = b(i) * c(i) END DO