Compaq Fortran
Release Notes for Compaq Tru64
UNIX Systems
1.9.3 Corrections
This section lists problems in previous versions that have been fixed
in this version.
- In programs compiled with the
-wsf
option, pointer assignments inside a FORALL did not work reliably. In
many cases, incorrect program results occurred.
- The ASSOCIATED intrinisc sometimes returned incorrect results in
programs compiled with the
-wsf
compile-time option.
- GRADE_UP and GRADE_DOWN were not stable sorts.
1.9.4 Known Problems
1.9.4.1 "Variable used before its value has been defined" Warning
The compiler may inappropriately issue a "Variable is used before
its value has been defined" warning. If the variable named in the
warning does not appear in your program (e.g. var$0354), you should
ignore the warning.
1.9.4.2 Mask Expressions Referencing Multiple FORALL Indices
FORALL statements containing mask expressions referencing more than
seven FORALL indices do not work properly.
1.9.5 Unsupported Features
This section lists unsupported features in this release of Compaq
Fortran.
1.9.5.1 SMP Decomposition (OpenMP) not Currently Compatible with HPF
Manual decomposition directives for SMP (such as the OpenMP directives
enabled with the
-omp
option, or the directives enabled with the
-mp
option) are not currently compatible with the
-wsf
option.
1.9.5.2 Command Line Options not Compatible with the -wsf Option
The following command line options may not be used with the
-wsf
option:
- The -feedback and -cord options are not compatible, since they
require the use of -p, which is not compatible with
-wsf
.
- -double_size 128
- -gen_feedback
- -p, -p1, -pg (use -pprof instead)
- -fpe1, -fpe2, -fpe3, -fpe4
- -om
- -mp
- -omp
1.9.5.3 HPF_LOCAL Routines
Arguments passed to HPF_LOCAL procedures cannot be distributed
CYCLIC(n). Furthermore, they can have neither the inherit
attribute nor a transcriptive distribution.
Also, the following procedures in the HPF Local Routine Library are not
supported in the current release:
- ACTIVE_NUM_PROCS
- ACTIVE_PROCS_SHAPE
- HPF_MAP_ARRAY
- HPF_NUMBER_MAPPED
- LOCAL_BLKCNT
- LOCAL_LINDEX
- LOCAL_UINDEX
1.9.5.4 SORT_UP and SORT_DOWN Functions
The SORT_UP and SORT_DOWN HPF library procedures are not supported.
Instead, use GRADE_UP and GRADE_DOWN, respectively.
1.9.5.5 Restricted Definition of PURE
In addition to the restrictions on PURE functions listed in the Fortran
95 language standard and in the High Performance Fortran Language
Specification, Compaq Fortran adds the additional restriction that
PURE functions must be resident. "Resident" means
that the function can execute on each processor without reading or
writing any data that is not local to that processor.
Non-resident PURE functions are not handled. They will probably cause
failure of the executable at run-time if used in FORALLs or in
INDEPENDENT DO loops.
1.9.5.6 Restrictions on Procedure Calls in INDEPENDENT DO and FORALL
In order to execute in parallel, procedure calls from FORALL and DO
INDEPENDENT constructs must be resident. "Resident"
means that the function can execute on each processor without reading
or writing any data that is not local to that processor. The compiler
requires an explicit assertion that all procedure calls are resident.
You can make this assertion in one of two ways:
- by labeling every procedure called by the FORALL or INDEPENDENT DO
loop as PURE
- by encapsulating the entire body of the loop in an ON HOME RESIDENT
region.
Because of the restricted definition of PURE in Compaq Fortran (see
Section 1.9.5.5), the compiler interprets PURE as an assertion by the
program that a procedure is resident.
Unlike procedures called from inside FORALLs, procedures called from
inside INDEPENDENT DO loops are not required to be PURE. To assert to
the compiler that any non-PURE procedures called from the loop are
resident, you can encapsulate the entire body of the loop in an ON HOME
RESIDENT region.
If you incorrectly assert that a procedure is resident (using either
PURE or ON HOME RESIDENT), the program will either fail at run time, or
produce incorrect program results.
Here is an example of an INDEPENDENT DO loop containing an ON HOME
RESIDENT directive and a procedure call:
!HPF$ INDEPENDENT
DO i = 1, 10
!HPF$ ON HOME (B(i)), RESIDENT BEGIN
A(i) = addone(B(i))
!HPF$ END ON
END DO
.
.
.
CONTAINS
FUNCTION addone(x)
INTEGER, INTENT(IN) :: x
INTEGER addone
addone = x + 1
END FUNCTION addone
|
The ON HOME RESIDENT region does not impose any syntactic restrictions.
It is merely an assertion that inter-processor communication will not
actually be required at run time.
For More Information:
- On the requirements for parallel execution of INDEPENDENT DO loops,
see Section 1.9.1.3
1.9.5.7 Restrictions on Routines Compiled with -nowsf_main
The following are restrictions on dummy arguments to routines compiled
with the
-nowsf_main
compile-time option:
- The dummy must not be assumed-size
- The dummy must not be of type CHARACTER*(*)
- The dummy must not have the POINTER attribute
- %LOC must not be applied to distributed arguments
Failure to adhere to these restrictions may result in program failure,
or incorrect program results.
1.9.5.8 RAN and SECNDS Are Not PURE
The intrinsic functions RAN and SECNDS are serialized (not executed in
parallel). As a result, they are not PURE functions, and cannot be used
within a FORALL construct or statement.
1.9.5.9 Nonadvancing I/O on stdin and stdout
Nonadvancing I/O does not work correctly on
stdin
and
stdout
. For example, this program is supposed to print the prompt ending with
the colon and keep the cursor on that line. Unfortunately, the prompt
does not appear until after the input is entered.
PROGRAM SIMPLE
INTEGER STOCKPRICE
WRITE (6,'(A)',ADVANCE='NO') 'Stock price1 : '
READ (5, *) STOCKPRICE
WRITE (6,200) 'The number you entered was ', STOCKPRICE
200 FORMAT(A,I)
END PROGRAM SIMPLE
|
The work-around for this bug is to insert a CLOSE statement after the
WRITE to
stdout
. This effectively flushes the buffer.
PROGRAM SIMPLE
INTEGER STOCKPRICE
WRITE (6,'(A)',ADVANCE='NO') 'Stock price1 : '
CLOSE (6) ! Add close to get around bug
READ (5, *) STOCKPRICE
WRITE (6,200) 'The number you entered was ', STOCKPRICE
200 FORMAT(A,I)
END PROGRAM SIMPLE
|
1.9.5.10 WHERE and Nested FORALL
The following statements are not currently supported:
- WHERE statements inside FORALLs
- FORALLs inside WHEREs
- Nested FORALL statements
When nested DO loops are converted into FORALLs, nesting is ordinarily
not necessary. For example,
DO x=1, 6
DO y=1, 6
A(x, y) = B(x) + C(y)
END DO
END DO
|
can be converted into
FORALL (x=1:6, y=1:6) A(x, y) = B(x) + C(y)
|
In this example, both indices (x and y) can be defined in a single
FORALL statement that produces the same result as the nested DO loops.
In general, nested FORALLs are required only when the outer index is
used in the definition of the inner index. For example, consider the
following DO loop nest, which adds 3 to the elements in the upper
triangle of a 6 X 6 array:
DO x=1, 6
DO y=x, 6
A(x, y) = A(x, y) + 3
END DO
END DO
|
In Fortran 95/90, this DO loop nest can be replaced with the following
nest of FORALL structures:
FORALL (x=1:6)
FORALL (y=x:6)
A(x, y) = A(x, y) + 3
END FORALL
END FORALL
|
However, nested FORALL is not currently supported in parallel (i.e.
with the
-wsf
option).
A work-around is to use the INDEPENDENT directive:
integer, parameter :: n=6
integer, dimension (n,n) :: A
!hpf$ distribute A(block,block)
A = 8
!hpf$ independent, new(i)
do j=1,n
!hpf$ independent
do i=j,n
A(i,j) = A(i,j) + 3
end do
end do
print "(6i3)", A
end
|
All three of these code fragments would convert a matrix like this:
[8 8 8 8 8 8 ]
[8 8 8 8 8 8 ]
[8 8 8 8 8 8 ]
[ ]
[8 8 8 8 8 8 ]
[8 8 8 8 8 8 ]
[8 8 8 8 8 8 ]
[ ]
|
into this matrix:
[11 11 11 11 11 11 ]
[ 8 11 11 11 11 11 ]
[ 8 8 11 11 11 11 ]
[ ]
[ 8 8 8 11 11 11 ]
[ 8 8 8 8 11 11 ]
[ 8 8 8 8 8 11 ]
[ ]
|
1.9.6 Obsolete Features Deleted
1.9.6.1 GLOBAL_TO_PHYSICAL and GLOBAL_LBOUNDS are Deleted
The following obsolete HPF Local Library routines have been deleted:
- GLOBAL_TO_PHYSICAL
- GLOBAL_LBOUNDS
1.9.7 Miscellaneous
This section contains miscellaneous release notes relevant to HPF.
1.9.7.1 What To Do When Encountering Unexpected Program Behavior
This section gives some guidelines about what to do when your program
displays unexpected behavior at runtime. The two most common problems
are incorrect programs that either segmentation fault or hang at
runtime.
Before attempting to debug parallel HPF programs, it is important to
verify first that the program runs correctly when compiled without the
-wsf
command line switch.
When the problem occurs only when compiled with the
-wsf
switch, the best way to debug these programs is to execute them with the
-debug
command line switch.
In addition, programs with zero sized arrays which were compiled with
-fast
or
-assume nozsize
may behave erratically or fail to execute.
1.9.7.1.1 Incompatible or Incomplete Libraries Installed
If your program displays unexpected behavior at runtime, your system
might have incomplete or incompatible libraries installed. You must
have PSE160 installed on your system to execute programs compiled with
the
-wsf
switch. PSE180 is not sufficient. In addition, for this release, you
must have first installed PSE160. Then you must have installed Fortran
V5.2, including the HPFLIBS170 subset.
Choose one of the following options to fix an incorrect installation:
- If you have installed Fortran V5.2 but are missing PSE160, then
install PSE160. Delete the HPFLIBS170 subset of Fortran V5.2 and then
reinstall the HPFLIBS170 subset.
- If you installed Fortran V5.2 first and then PSE160, then delete
the HPFLIBS170 subset of Fortran V5.2. Next, reinstall the HPFLIBS170
subset.
- If you already have Fortran V5.2 and PSE160 installed but did not
install the HPFLIBS170 subset of Fortran V5.2, then simply install the
HPFLIBS170 subset.
- If you deleted any old PSESHPF subset after installing Fortran
V5.2, this will also cause problems. In this case delete the HPFLIBS170
subset of Fortran V5.2 and then reinstall the HPFLIBS170 subset.
- If you have installed PSE180 but not PSE160, then begin to correct
this situation by deleting PSE180. Install PSE160. Next, reinstall
PSE180. You need both PSE160 and PSE180; PSE180 must be installed last.
Finish by deleting the HPFLIBS170 subset of Fortran V5.2 and then
reinstalling the HPFLIBS170 subset.
For more information about installing PSE160, see the Compaq
Parallel Software Environment Release Notes, Version 1.6.
For more information about installing PSE180, see the Compaq
Parallel Software Environment Release Notes, Version 1.8.
1.9.7.1.2 Segmentation Faults
When a program segmentation faults at runtime it can be confusing
because it may look like the program executed, even though no output is
produced. The PSE does not always display an error message when the
return status of the executed program is non zero. In particular, if
the program segmentation faults it does not display an error message,
the program just stops. In this example, program "bad" gets a
segmentation fault at runtime.
To see the execution status, type this
csh
command (other shells require different commands):
A status of
-117
indicates a segmentation fault. See the section about known problems in
the Parallel Software Environment (PSE) Version 1.6 release notes.
Alternatively, you can run the program in the debugger. This is better
because it shows what went wrong on each peer. To do this, use the
-debug
command line switch.
See Chapter 9 of the DIGITAL High Performance Fortran 90 HPF and PSE Manual for more information.
Note that some correct programs may segmentation fault at runtime due
to lack of stack space and data space. See Section 1.9.7.2 for further
details.
1.9.7.1.3 Programs that Hang
If your program hangs at runtime, rerun it in the debugger. You can type
<ctrl>/c
in the debugger to get it to stop. Then look at the stack frames to
determine where and why the program is hanging. Programs can hang for
many reasons. Some of the more common reasons are:
- Incorrect or incorrectly-spelled HPF directives
- Incorrect usage of extrinsic routines
- Templates not large enough
- Incorrect interfaces
- Missing interface blocks
- Allocatables aligned incorrectly
- Arrays aligned outside of template bounds
- Exceeding the available stack or data space (see Section 1.9.7.2)
It is always best to compile, run, and debug the program without the
-wsf
switch first to verify program correctness. Since it is easier to debug
scalar programs than parallel programs, this should always be done
first.
1.9.7.1.4 Programs with Zero Sized Arrays
Programs with zero sized arrays should not be compiled with the
-fast
or the
-assume nozsize
command line options; see Chapter 8 in the DIGITAL High Performance Fortran 90 HPF and PSE Manual. If you
incorrectly compile this way there are several different types of
behavior that might occur. The program might return an error status of
-122
or
-177
or
64
. It might also hang (or timeout when the
-timeout
switch is used). Try compiling the program without these options and
execute it to see if it works correctly. If it does, there is most
likely a zero-sized array in the program.
1.9.7.2 Stack and Data Space Usage
Exceeding the available stack or data space on a processor can cause
the program execution to fail. The failure takes the form of a
segmentation violation, which results in an error status of -117. (See
the section about known problems in the Parallel Software Environment
(PSE) Version 1.6 release notes.) This problem can often be corrected
by increasing the stack and data space sizes or by reducing the stack
and data requirements of the program. The following
csh
commands increase the sizes of the stack and data space up to system
limits (other shells require different commands):
limit stacksize unlimited
limit datasize unlimited
|
If your system limits are not sufficient, contact your system
administrator, and request that
maxdsiz
(the data space limit) and/or
maxssiz
(the stack limit) be increased.
1.9.7.3 Non-"-wsf" main programs
The ability to call parallel HPF subprograms from non-parallel (Fortran
or non-Fortran) main programs, is supported in this release. For more
information, see Chapter 6 of the DIGITAL High Performance Fortran 90 HPF and PSE Manual.
1.9.7.4 Using "-std" Disables HPF Directive Checking
Normally, all HPF directives are checked for syntactic and semantic
correctness regardless of whether or not the
-wsf
switch is specified. To disable this checking, specify the
-std
option.
1.9.7.5 Use the Extended Form of HPF_ALIGNMENT
Due to an anomaly in the High Performance Fortran Language
Specification, the extended version of the HPF_ALIGNMENT library
routine (High Performance Fortran Language Specification V.2
Section 12.2) is incompatible with the standard version (High
Performance Fortran Language Specification V.2 Section 7.7).
In particular, the DYNAMIC argument, which is valid only in the
extended version, is not the final argument in the argument list.
Because each compiler vendor must choose to implement only one version
of this library routine, programs that use this routine are not
portable from one compiler to another unless keywords are used for each
of the optional arguments.
Compaq chooses to support the extended version of this library routine.
1.9.7.6 EXTRINSIC(SCALAR) Changed to EXTRINSIC(HPF_SERIAL)
EXTRINSIC(SCALAR) was renamed to EXTRINSIC(HPF_SERIAL) to be compatible
with Versions 1.1 and later of the High Performance Fortran
Language Specification. EXTRINSIC(SCALAR) continues to be
supported in this release, but may not be supported in future releases.
1.9.8 Example Programs
The
/usr/examples/hpf
directory contains example Fortran programs. Most of these programs are
referred to in the HPF Tutorial section of the DIGITAL High Performance Fortran 90 HPF and PSE Manual. Others
are just there to show examples of HPF code and PVM code. The provided
makefile can be used to compile all these programs.
-
heat_example.f90
solves a heat flow distribution problem. It is referred to by the
Solving Nearest Neighbor Problems section of the DIGITAL High Performance Fortran 90 HPF and PSE Manual.
-
io_example.f90
implements a network striped file. It is referred to by the Network
Striped Files chapter of the DIGITAL High Performance Fortran 90 HPF and PSE Manual. This program is a good
example of how to use EXTRINSIC(HPF_LOCAL) routines.
-
lu.f90
implements a LU Decomposition. It is referred to by the LU
Decomposition chapter of DIGITAL High Performance Fortran 90 HPF and PSE Manual.
-
mandelbrot.f90
visualizes the Mandelbrot Set. It is referred to by the HPF Tutorial.
This program uses the PURE attribute and non-Fortran subprograms within
an HPF program. Mandelbrot also requires these files:
simplex.h, simplex.c
, and
dope.h
. Read the
readme.mandelbrot
file to see how to compile and execute Mandelbrot.
-
pi_example.f90
calculates pi using four different Fortran 90 methods. This program
contains a timing module which may be pulled out and used separately.
-
shallow.f90
is a optimized HPF version of the Shallow Water benchmark.
-
twin.f90
demonstrates Compaq Fortran's new non-wsf main program capability.
-
hpf_gexample.f
is a Fortran program with explicit calls to PVM. It demonstrates some
group and reduction operations in PVM. You must have PVM installed to
run this program.
-
hpf.tcl
is a TK-based HPF data distribution learning aid. It illustrates the
data distribution patterns represented by various data distributions,
such as (BLOCK, *), (*, CYCLIC), (BLOCK, CYCLIC), etc.
-
fft.f90
performs a fast Fourier transform, achieving parallelism by means of
EXTRINSIC(HPF_LOCAL) routines.
1.10 New Features and Corrections in Version 5.1
Version 5.1 is a major release that includes corrections to problems
discovered since Version 5.0 was released.
The following topics are discussed:
1.10.1 Version 5.1 New Features
The following new Compaq Fortran (DIGITAL Fortran 90) features are now
supported:
- DIGITAL Fortran 90 on UNIX contains full support for OpenMP. Here
are some details from the OpenMP web site (http://www.openmp.org).
The OpenMP application program interface (API) supports
multi-platform shared-memory programming on UNIX platforms and
Microsoft® Windows NTtm architectures. Jointly defined
by a group of major computer hardware and software vendors, OpenMP is a
portable, scalable model that gives shared-memory programmers a simple
and flexible interface for developing parallel applications for
platforms ranging from the desktop to the supercomputer.
For more
information on the OpenMP Fortran API, see the revised user manual.
The following directives in OpenMP are supported by DIGITAL Fortran
90 Version 5.1:
- !$OMP PARALLEL and !$OMP END PARALLEL
- !$OMP DO and !$OMP END DO
- !$OMP SECTIONS and !$OMP END SECTIONS and !$OMP SECTION
- !$OMP SINGLE and !$OMP END SINGLE
- !$OMP PARALLEL DO and !$OMP END PARALLEL DO
- !$OMP PARALLEL SECTIONS and !$OMP END PARALLEL SECTIONS
- !$OMP MASTER and !$OMP END MASTER
- !$OMP CRITICAL [(name)] and !$OMP END CRITICAL [(name)]
- !$OMP BARRIER
- !$OMP ATOMIC
- !$OMP FLUSH
- !$OMP ORDERED and !$OMP END ORDERED
- !$OMP THREADPRIVATE
The following clauses on directives in OpenMP are supported by
DIGITAL Fortran 90 Version 5.1:
- IF (exp)
- PRIVATE(list)
- SHARED(list)
- DEFAULT (PRIVATE | SHARED | NONE)
- FIRSTPRIVATE(list)
- LASTPRIVATE(list)
- REDUCTION({operator | intrinsic} : list)
- COPYIN(list)
- SCHEDULE(type[,chunksize])
- ORDERED
- The following new features are now supported:
- As of DIGITAL UNIX v4.0, constants in Fortran code are placed in
read-only memory. An attempt to modify a constant (as in the example
below) has always been an error but will now cause the program to abort:
CALL F (1)
...
SUBROUTINE F (I)
I = 2
|
- A change in the math library (
libm
) starting with DIGITAL UNIX v4.0B is that
MOD(3.0,0.0)
now returns "floating invalid"; it used to return "0".
- Several new intrinsics are now available in DIGITAL Fortran 90. For
more details, see the online Fortran 90 help file, located in:
/usr/lib/cmplrs/fort90/decfortran90.hlp
|
- ASM - execute in-line assembler code
- LEADZ and TRAILZ - count leading and trailing 0 bits in an integer
- POPCNT - count 1 bits in an integer
- POPPAR - parity of the bits in an integer
- MULT_HIGH - multiply two 64-bit unsigned integers
- The X-Open Standard followed by DIGITAL UNIX made a change to its
"pow" function that affects Fortran's "**" operation: (0.0)**Y for all
negative values of Y {single or DOUBLE PRECISION} will now return
"-Infinity" (using
-fpe3
); it used to return "+Infinity".
- The following new
f90
command options are now supported:
-
-align recnbyte
Requests that fields of records and components of derived types be
aligned on the smaller of:
- The size byte boundary (N) specified (N is 1, 2,
4, or 8)
- The boundary that will naturally align them
Specifying
-align recnbyte
does not affect whether common blocks are naturally aligned or packed.
-
-altparam
Specifies if the alternate form of parameter constant declarations
(without parenthesis) is recognized. The default is
-altparam
.
-
-assume minus0
Tells compiler to use Fortran 95 standard semantics for the
treatment of the IEEE® floating value -0.0 {of all KINDs}. There
are two places where Fortran 95 defines behavior on -0.0:
- SIGN (data, -0.0) is "data" with a negative sign, whereas the
Fortran 90 standard says SIGN (data, -0.0) is the same as SIGN (data,
+0.0) which is "data" with a positive sign
- Fortran 95 says that -0.0 prints as "-0.0", whereas Fortran 90 says
it prints as "0.0"
-assume nominus0
is the default {this is a change from DIGITAL Fortran 90 V5.0} and
means that SIGN (data, -0.0) is the same as SIGN (data, +0.0) {the
Fortran 90 and FORTRAN 77 standard semantics}
The
f95
command driver adds "-assume minus0" to the
compiler command line (before any other options) so the
f95
command will get the Fortran 95 standard semantics.
-
-check omp_bindings
Provides run-time checking to enforce the OpenMP binding rules:
- It is an error to enter a DO, SINGLE, or SECTIONS if you are
already in a work-sharing construct, a CRITICAL SECTION, or a MASTER.
- It is an error to attempt to execute a BARRIER if you are already
in a work-sharing construct, a CRITICAL SECTION, or a MASTER.
- It is an error to attempt to execute a MASTER directive if you are
already in a work-sharing construct.
- It is an error to execute an ORDERED directive if you are already
in a CRITICAL SECTION.
- It is an error to execute an ORDERED directive unless you are
already in an ORDERED DO.
The default is
-check noomp_bindings
:
-
-omp
implies
-check omp_bindings
-
-fast -omp
implies
-check noomp_bindings
, regardless of the placement of
-fast
- If the user wants the checking done on
-mp
, specify
-check omp_bindings
explicitly
At run-time, the errors in example program
t.f
trigger an ASSERTION error and the program aborts:
Example program t.f:
real b(100)
x = 0
!$omp paralleldo
do i= 1, 100
b(i) = i
!$omp single
x = x + 1
!$omp end single
end do
print *, b, x
end
> f90 -omp t.f
> a.out
forrtl: severe (145): assertion error
|
-
-module directory
Requests that the compiler create module files in the specified
directory instead of the current directory.
-
-omp
Enables recognition of OpenMP directives.
-
-std95
Enables Fortran 95 standards checking (
-std90
or
-std
enable Fortran 90 standards checking).
-
-warn truncated_source
Requests that the compiler issues a warning diagnostic message
when it reads a source line with a statement field that exceeds the
maximum column width in fixed-format source files. The maximum column
width for fixed-format files is column 72 or 132, depending whether the
-extend_source
option was specified.
This option has no effect on truncation;
lines that exceed the maximum column width are always truncated.
This option does not apply to free-format source files. The default is
-warn notruncated_source
.
- Additional support has been provided for directed parallel
processing using the
-omp
and
-mp
options.
For more information on the parallel directives, see the
Compaq Fortran User Manual for Tru64 and Linux Alpha Systems.
To allow task-local thread storage, you must be using Version 4.0D
(code name PTmin) of the DIGITAL UNIX operating system.
The
following problem in the use of
-omp
and
-mp
parallel directives should be noted:
In the following example
test.f
, the user should add "firstprivate(k,m)" to initialize the private
variables k and m for use in the loop control expressions.
Example test.f:
dimension x(10)
k = 1
m = 10
!$omp parallel
!$omp do private(k,m)
do i = k,m
x(i) = i
enddo
!$omp end parallel
print *, x
end
> f90 -omp test.f
f90: Warning: test.f, line 8: Variable K is used before its value has been
defined
do i = k,m
------^
f90: Warning: test.f, line 8: Variable M is used before its value has been
defined
do i = k,m
------^
|
- The following Fortran 95 features are have been implemented in
Version 5.1:
- Zero-length formats
On output, when using I, B, O, Z, and F
edit descriptors, the specified value of the field width can be zero.
In such cases, the compiler selects the smallest possible positive
actual field width that does not result in the field being filled with
asterisks (*).
- The command-line options
-assume minus0
and
-std95
(described previously in this section).
1.10.2 Version 5.1 Corrections
Since Version 5.0, the following corrections have been made:
- Using ASSOCIATED with f90 pointer now gives correct answer.
- Using vector subscripts in MATMUL now gives correct answer.
- Passing %REF argument to a routine with explicit INTERFACE no
longer gets an internal error.
- CSHIFT of an array pointer contained within a derived type no
longer gets an internal error.
- Compiling files that contain very long routine names with
-v
no longer gets an internal error.
- Using assignments in a defined generic assignment subroutine when
the subroutine is not RECURSIVE now gets an error.
- Parameter constant is allowed as argument of a LOC intrinsic.
- Using UNION within derived type now gets correct result.
- Having EQUIVALENCEd character array elements within a MODULE no
longer gets internal error.
- Duplicate SAVE statement no longer gets an error.
- Parameter constant can be used as case-value in a SELECT CASE
statement.
- ALIAS attribute can now be specified in a cDEC$ ATTRIBUTE directive
for a variable that has not been declared EXTERNAL (EXTERNAL is
assumed).
- Interface with optional function argument is now resolved properly.
- Using record fields in multiply and add operations now produces
correct result.
- Using the following operators: ==, /=, <, >, <=, and >=
no longer get non-standard conforming warnings.
- Extra trailing blanks are now allowed and ignored when used in
specifier of OPEN statement, e.g., FORM='formatted '.
- Passing an array argument to a statement function now gets an error.
- INTEGER*2 array now gets correct result when compiled with
-integer_size 16
.
- Fix a bug related to module importing with modules that contain
PRIVATE statement.
- Parameter constant defined in a MODULE is now imported when its use
is only in a variable format expression.
- C attribute can be specified in a cDEC$ ATTRIBUTE directive for
module variables.
- Parameter constants are allowed in a structure constructor.
- A derived type component having the same name as a common block no
longer gets an internal error.
- IVDEP directive can be specified between PDO and DO statements.
- A non-standard warning is issued if the first argument of a GENERIC
assignment procedure is not INTENT(OUT) or INTENT(INOUT).
- $PACK directive and the
-align recnbyte
option now affect alignment of data items in a SEQUENCE derived-type.
- Using a structure constructor to initialize a multi-dimensional
array component of a derived-type no longer causes an internal error.
- Fix $omp parallel copyin (/common_block/) directive.
- The
-fpconstant
option now works correctly for assignment to double complex variables.
- Having a D line as the first non-comment line after a conditional
$ENDIF directive no longer gets an error.
- No longer flag ES format as non-standard.
- Remove an internal limit on the number of entries of a NAMELIST
- Using substring of a character array as argument of ICHAR intrinsic
no longer gets internal error
- Pointer assignment of an array of character substrings now gets
correct result. For example:
p=>a(:)(2:4)
)
- Using array transformation intrinsics such as PACK, SPREAD, and
RESHAPE with array of derived-type as argument in a PRINT statement now
gets correct results
- Allow an array with a name of TYPE
- Specifying $NOFREEFORM in a .f90 file now sets the line size to 72
columns
- Remove a limit of 256 number of arguments for subroutines and
functions
- An incorrect statement: "IF (ABS(I).GT 1) I=0" now gets an error
message
- An incorrect statement: "CHARACTER(LEN=1), PARAMETER :: CPSCLR = '' ''" now
gets an error message
- Using record fields in multiply and subtract operations now
produces correct results
- Having a PRIVATE, EQUIVALENCE variable in a module no longer causes
compile time segmentation violation
- Specifying ONLY on one variable in a COMMON block now only declares
the one variable (not the entire variables) in the COMMON block
- Allow user-defined operator to be used as the format character
expression in a PRINT or READ statement
- Using modules and the AUTOMATIC statement in the same routine no
longer gets internal error
- Module variables with EXTERN attributes now work properly
- Increase an internal limit so that large programs no longer get the
"text handle table overflow" message
- Using record fields in exponentiation and subtract operations now
produce correct result
- Flag incorrect usage of an entry dummy argument in an executable
statement before its declaration in the entry statement
- Disallow optional return dummy argument following other OPTIONAL
dummy arguments
- An invalid WRITE statement no longer gets an internal error
- Allow passing NULL intrinsic function as argument to other routines
- Allow AUTOMATIC variables to be used in an EQUIVALENCE statement
- Using a structure constructor with scalar value to assign an array
element now produces correct result
- Using an array constructor with integer value to initialize a real
or complex array now produces correct result
- Flag common block name and routine name conflict
- Fix elemental character function with varying length
- Fix problem where
-assume dummy_aliases
wasn't being taken into account in checks for overlap in array
assignment.
- If !DEC$ ATTRIBUTES C is specified in an INTERFACE block, and an
argument is declared as having an array type, always pass that argument
by reference even if the actual argument is a single array element.
- Allow a concatenation expression as the first argument to TRANSFER.
- Implement
-std90
and
-std95
options.
- A STRUCTURE with no fields no longer causes a compiler failure.
- No longer issue standards warning for certain cases with a
relational operator followed by a unary minus.
- Do not give spurious "more variables than values" warning for
certain cases of data initialization of multi-dimensional arrays.
- User-defined generic interface for IDATE no longer causes internal
compiler error.
- LOC(funcname) as an actual argument when used inside function
"funcname" now properly returns the address of the return value
variable and not the entry point.
- The compiler no longer gives spurious errors (including internal
compiler failures) in certain cases where a module file cannot be
opened.
- Certain incorrect programs which include a reference to fields of
an undeclared STRUCTURE no longer cause an internal compiler error.
- Give error when ALLOCATED is used on a non-ALLOCATABLE object.
- Allow a recursive function name to be passed as an actual argument
inside the function.
- If an INCLUDE file includes a directive to change the source form,
revert to the original setting after returning to the including source
file.
The following limitations were fixed in Version 2.0 or
previous releases:
- The
f90
command option
-wsf
and its related options are now supported.
- Allocatable arrays that are allocated but not deallocated before
routine exit are now deallocated upon exit from routine.
- The
f90
command options
-cord
and
-feedback
described in the documentation have now been implemented.
1.10.3 HPF Version 5.1 New Features
1.10.3.1 SHADOW Directive Now Supported
The new SHADOW directive, as defined in Version 2.0 of the High
Performance Fortran Language Specification, is now supported.
SHADOW is now a separate HPF directive, rather than a keyword inside
the DISTRIBUTE directive.
1.10.3.2 Pointers Now Handled in Parallel
Mapped variables with the POINTER attribute are now handled in
parallel. This capability is an approved extension of the High
Performance Fortran Language Specification.
1.10.3.3 SHADOW Directive Required for Nearest-Neighbor POINTER or TARGET Arrays
The compiler will not generate shadow edges automatically for
arrays with the POINTER or TARGET attributes. In order to be eligible
for the compiler's nearest-neighbor optimization, POINTER or TARGET
arrays must explicitely be given shadow edges using the SHADOW
directive. If pointer assignment is done, both the POINTER and the
TARGET must have the same mapping, including shadow edges.
For More Information:
- On the conditions that must be satisfied for a statement to be
eligible for the nearest-neighbor optimization, see Section 1.9.1.4 of
these Release Notes.
1.10.3.4 Descriptive Mapping Directives are Now Obsolescent
In Version 1 of the HPF Language Specification, a special form of the
DISTRIBUTE and ALIGN directives was used in interfaces and procedures
when mapped arrays were passed to a procedure. Known as
descriptive mapping, it was specified by an asterisk (*)
appearing before the left parenthesis "(" in a DISTRIBUTE
directive, or after the WITH in an ALIGN directive. For example,
!HPF$ DISTRIBUTE R*(BLOCK, BLOCK)
!HPF$ ALIGN S WITH *R
|
Beginning with version 2.0 of the High Performance Fortran Language
Specification (DIGITAL Fortran 90 Version 5.0), the meaning of
descriptive syntax has changed. Descriptive mapping is now a weak
assertion that the programmer believes that no data communication is
required at the procedure interface. If this assertion is wrong, the
data communication will in fact occur.
Although there is now no semantic difference between the descriptive
form and the ordinary prescriptive form, there is still some benefit in
using the descriptive form. Compaq Fortran generates informational
messages when a descriptive directive is specified if the compiler is
unable to confirm that there will in fact be no communication. These
messages can uncover subtle programming mistakes that cause performance
degradation.
Existing programs with descriptive mapping directives will continue to
compile and run with no modification.
In the future, DIGITAL may provide a command-line option that specifies
that descriptive directives be treated as strong assertions that data
communication will not be necessary at the procedure interface. This
would allow the compiler to omit checking whether the mappings of the
actual and dummy agree, leading to performance improvement in some
cases.
1.10.3.5 New support for HPF Local Library Routines GLOBAL_LBOUND and GLOBAL_UBOUND
The following HPF Local Library routines are now supported:
- GLOBAL_LBOUND
- GLOBAL_UBOUND
1.10.3.6 REDUCTION Clause in INDEPENDENT Directives
The REDUCTION clause in INDEPENDENT directives is now supported.
1.10.3.7 HPF_SERIAL Restriction Lifted for Procedures Called from INDEPENDENT DO Loops
Previous versions required procedures called from inside INDEPENDENT DO
loops to HPF_SERIAL in order to obtain parallel execution. This
restriction is now lifted.
For More Information:
- On the requirements for parallel execution of INDEPENDENT DO loops
containing procedure calls, see Section 1.9.5.6 of these Release Notes.
1.10.4 HPF Version 5.1 Corrections
This section lists problems in previous versions that have been fixed
in this version.
- Some bugs in implementing whole structure references in IO and
assignment were fixed.
- Aligning components of derived types is now supported.
- The restriction that statements with scalar subscripts are not
eligible for the nearest-neighbor optimization is now removed.
Statements with scalar subscripts may now be eligible for the
nearest-neighbor optimization if that array dimension is (effectively)
mapped serially.
- Nearest-neighbor assignments with derived types are now eligible
for the nearest-neighbor optimization.
1.11 New Features and Corrections in Version 5.0
Version 5.0 is a major release that also includes corrections to
problems discovered since Version 4.1 was released.
The following topics are discussed:
1.11.1 Version 5.0 New Features
The following new Compaq Fortran (DIGITAL Fortran 90) features are now
supported:
- The
-mp
compiler option enables parallel processing using directed
decomposition. Parallel processing is directed by inserting !$PAR
directives in your source code. This type of parallel processing is for
shared memory multiprocessor systems.
To enable parallel processing
across clusters of servers or workstations with !HPF$ directives,
continue to use the
-wsf
compiler option.
On a shared memory system, you can use both the
-mp
and the
-wsf
options for the same program. This combination provides improved
performance for certain programs running mostly on shared memory
systems.
The new parallel directives:
- Use the !$PAR prefix
- Are recognized only if compiled with the
-mp
option
- Some of the parallel !$PAR directives include:
PARALLEL and END PARALLEL
PDO
PARALLEL DO
PSECTIONS
CRITICAL SECTION
TASK COMMON
- Environment variables control the run-time behavior. For example,
MP_THREAD_COUNT specifies how many threads to create.
To allow task-local thread storage, you must be using Version 4.0D
(code name PTmin) of the DIGITAL UNIX operating system.
For more
information on these directives, see the Compaq Fortran User Manual
for Tru64 UNIX and Linux Alpha Systems.
- The
-warning_severity keyword
compiler option allows you to:
- Specify
-warning_severity errors
to make all compiler warning messages error-level instead of
warning-level messages.
- Specify
-warning_severity stderrors
to make standards checking compiler warning messages (
-std
option) error-level instead of warning-level messages.
- The
-warn nogranularity
compiler option allows you to suppress the NONGRNACC warning message:
Unable to generate code for requested granularity
.
- An internal procedure can now be used as an actual argument.
- Support for certain new language extensions for compatibility with
Compaq Visual Fortran (and Microsoft® Fortran PowerStation). These
features include the following:
- # Constants--constants using other than base 10
- C Strings--NULL terminated strings
- Conditional Compilation And Metacommand Expressions ($define,
$undefine, $if, $elseif, $else, $endif)
- $FREEFORM, $NOFREEFORM, $FIXEDFORM--source file format
- $INTEGER, $REAL--selects size
- $FIXEDFORMLINESIZE--line length for fixed form source
- $STRICT, $NOSTRICT--F90 conformance
- $PACK--structure packing
- $ATTRIBUTES ALIAS--external name for a subprogram or common block
- $ATTRIBUTES C, STDCALL--calling and naming conventions
- $ATTRIBUTES VALUE, REFERENCE--calling conventions
- \ Descriptor--prevents writing an end-of-record mark
- Ew.dDe and Gw.dDe Edit Descriptors--similar to Ew.dEe and Gw.dEe
- 7200 Character Statement Length
- Free form infinite line length
- $DECLARE and $NODECLARE == IMPLICIT NONE
- $ATTRIBUTES EXTERN--variable allocated in another source file
- $ATTRIBUTES VARYING--variable number of arguments
- $ATTRIBUTES ALLOCATABLE--allocatable array
- Mixing Subroutines/Functions in Generic Interfaces
- $MESSAGE--output message during compilation
- $LINE == C's #line
- INT1 converts to one byte integer by truncating
- INT2 converts to two byte integer by truncating
- INT4 converts to four byte integer by truncating
- COTAN returns cotangent
- DCOTAN returns double precision cotangent
- IMAG returns the imaginary part of complex number
- IBCHNG reverses value of bit
- ISHA shifts arithmetically left or right
- ISHC performs a circular shift
- ISHL shifts logically left or right
The following new High Performance Fortran (HPF) features and
corrections have been added for DIGITAL Fortran Version 5.0:
- The new SHADOW directive, as defined in Version 2.0 of the HPF
specification, is now supported. SHADOW is now a separate HPF
directive, rather than a keyword inside the DISTRIBUTE directive.
- Mapped variables with the POINTER attribute are now handled in
parallel. This capability is an approved extension of the HPF
specification.
- Beginning with version 2.0 of the HPF specification (DIGITAL
Fortran Version 5.0), the meaning of descriptive syntax has changed.
Descriptive mapping is now a weak assertion that the programmer
believes that no data communication is required at the procedure
interface. If this assertion is wrong, the data communication will in
fact occur.
Existing programs with descriptive mapping directives
will continue to compile and run with no modification and no
performance penalty.
- The following HPF Local Library routines are now supported:
- GLOBAL_LBOUND
- GLOBAL_UBOUND
- The REDUCTION clause in INDEPENDENT directives is now supported.
- Previous versions required procedures called from inside
INDEPENDENT DO loops to HPF_SERIAL in order to obtain parallel
execution. This restriction is now lifted.
- Some bugs in implementing whole structure references in IO and
assignment were fixed.
- Aligning components of derived types is now supported.
- The restriction that statements with scalar subscripts are not
eligible for the nearest-neighbor optimization is now removed.
Statements with scalar subscripts may now be eligible for the
nearest-neighbor optimization if that array dimension is (effectively)
mapped serially.
- Nearest-neighbor assignments with derived types are now eligible
for the nearest-neighbor optimization.
1.11.2 Version 5.0 Corrections
Since Version 4.1, the following corrections have been made:
- Fix SIGN intrinsic to handle --0.
- Fix LOC intrinsic and %LOC of a derived type field.
- Fixed debug information for dynamic character variable (such as
character*(i) c
).
- Add debugging support for integer (Cray) pointers.
- Fix storing to the return value of a function returning character
in a containing internal routine.
- Fix Nullification of a character*n pointer argument.
- Fix using passed length argument in a containing internal routine.
- Fix compiler abort when a source line is longer than 1024
characters in freeform source file.
- Fix using IOLENGTH in a INQUIRE statement.
- Fix FORALL problem of the form "X(X(I)) =."
- Fix contained functions returning an implicitly initialized
derived-type.
- Better diagnostics for invalid programs.
- Fix compiler abort when using Nullification of a pointer in a
MODULE.
- Fix a certain type of USE of a MODULE with rename list.
- Fix using
-extend_source:80
and
-pad_source
.
- Fix compiler abort when using do-loop style implicitly initialized
derived-types in a MODULE.
- Sign-extending INTEGER*2 parameter constants.
- Flag invalid nested internal procedures.
- Fix compiler abort of USE of a MODULE with namelist variables in
rename list.
- Issue a warning message for a intrinsic with wrong argument type
and treat it as an external.
- Issue a warning message for having a SAVE common block data object.
- Fix compiler abort of USE of a MODULE with namelists.
- Fix using SIZEOF(common_block_array) in a PARAMETER statement.
- Fix using READONLY keyword as first keyword in an OPEN statement.
- Allow record name to be the same as a structure name.
- Fix parameter character constant with embedded NULL character.
- Fix compiler abort when same name used as a structure and derived
type.
- Allow BLOCKSIZE keyword in an INQUIRE statement.
- Allow a record in a SAVE statement.
- Allow a module to have the name "procedures".
- Do not flag IABS intrinsic function as nonstandard.
- Do not flag DOUBLE COMPLEX as nonstandard.
- Treat POPCNT, POPPAR, LEADZ as external functions.
- Put out an error message for
ptr => pack(...)
.
- Treat C$DOACROSS as a comment.
- Issue an error message for invalid derived type parameter constant.
- Fix compiler abort when passing an array constructor as an actual
argument.
- Fix using derived-type components that are same as intrinsic names.
- Fix an incorrect warning about "explicit-shaped array is being
passed to a routine that expects a pointer or assumed-shape array"
- Fix a problem with
-warn:errors
and
-stand:f90
options. Nonstandard messages should be error messages.
- Fix incorrect results when compiled a program with
-assume:dummy_aliasing
.
- Do not flag BOZ constant as nonstandard.
- Do not flag Z format as nonstandard.
- Allow 511 continuation lines.
- Put out a standard warning for using character constant in DATA
statement.
- Fix using TRANSFER in initialization.
- Fix a problem with user defined assignment statement.
- Issue an error message when passing or receiving an optional
argument by value.
- Fix an invalid message about return value of a function is not
defined when the function returns an initialized derived type.
- Fix a compiler abort with "text handle table overflow" message.
- Fix a compiler abort using a SAVE statement.
- Fix a problem when an existing operator is overloaded.
- Fix argument checking of intrinsic subroutines.
- Fix generic interface of elemental functions.
- Issue an argument mismatch warning message for using an integer
with a statement function that takes real argument.
- Fix compiler directives processing.
- Fix a compiler abort using an invalid PARAMETER array.
- Issue an error message for SAVE of an ENTRY result variable.
- Fix using UNION within derive type.
- Fix a compiler internal error when using C and REFERENCE attributes
on a function name.
- Fix a compiler internal error when using ASSOCIATED of a function
returning a pointer.
- Add support for passing complex by value.
- Fix pointer assignment with a character substring.
- Allow using ICHAR in an array constructor within the initialization
part of an array declaration.
- Fix a problem with using UNION declaration within the derived type.
- Allow exporting of a module procedure which has a name that is the
same as a generic name.
- Fix a problem with using user defined assignment operation.
- Allow specifying NaNs in the PARAMETER statement.
- Allow D source line to continue a non-D source line.
- Fix a problem in array initialization processing.
- Cray pointees that were being allocated statically are now
correctly given no storage class.
- Using assume shape array within a contained routine no longer
produces an internal compiler error.
- An error message is now given for invalid keyword values given for
an I/O statement's keyword.
- Declarations of the type "character, allocatable :: field*7(:)", in
which the array shape specifier comes after the length specification in
a deferred-shape character array no longer produces an internal
compiler error.
- When assigning a derived type variable with a structure
constructor, if a character scalar is supplied to an character array
component, every elements of the array is assigned with the character
scalar value.
- The MVBITS intrinsic now gives correct result if its 4th argument
is a non-lowerbound subscripted array element.
- Reference of a character function, where the length of its return
value is dependent on one or more of its arguments, no longer produces
an internal compiler error.
- Pointer assignment should now work properly when the target is a
component of an allocatable array with a lower bound different of 1.
- Long NAMELISTs no longer causes a compiler internal error.
- The compiler now prints out better error messages for the PDONE
directive.
- When initializing a derived type variable with a structure
constructor, if a scalar is supplied to an array component, every
elements of the array is initialized with the scalar value.
- Allow %fill in STRUCTURE declarations using F90 syntax, such as:
integer :: %fill.
- Using unary "-" operator with record fields should now give correct
results.
- Use of NEAREST with two different KIND REAL arguments no longer
gets a nonstandard warning.
- Allow SIZEOF of assumed size record field.
- Module importing has been improved. If a module is USEd in both the
host and its internal procedure, the module is now only imported once
by the compiler.
- A module that contains "PRIVATE" followed by "PUBLIC variable" no
longer gets incorrect error message.
- Optional comma in DO with label, such as:
label: DO, JJ = 1, N, 1
no longer gets incorrect syntax error.
- Allow a dummy argument to have the same name as a structure field.
- A module that contains
USE module, ONLY : var
no longer gets internal compiler error.
- A component of a derived-type with a name that starts with FILL no
longer gets a syntax error.
- A PDONE directive in a statically-scheduled PDO loop no longer gets
an error message.
- Allow a variable with '_' in its name to be used in a variable
format expression.
- Fix for array references in CRITICAL SECTION directive.
- Set NOWAIT for paralleldo directive (the region waits, so do NOT
make the loop wait as well).
- Allow variables in COMMON/EQUIVALENCE on local, lastlocal, and
reduction lists. Create and use new local variables in parallel do
scopes for these variables.
- Allow c$copyin of EQUIVALENCE/COMMON variables.
- Fix
-mp
(ordered) bug.
- No longer import any definitions if a module is used with the "USE
module_name, ONLY:" statement.
- Fix a compile time stack overflow problem.
- Fix a "$IF DEFINED()" problem when a routine is defined between the
conditional compilation.
- Put out error message for an invalid use of "TYPE (type_name)"
statement.
- Allow RECORD in a NAMELIST.
- Fix using "# line_number" in DATA statement.
- The
-pad_source
option now properly pads Hollerith literals that are continued across
source records.
- Add standards warning for using two consecutive operators in an
expression.
- Allow POINTER attribute for character entities whose length is
specified by a variable expression or an * (assumed length character).
- Do not flag as nonstandard when all of the objects in the
EQUIVALENCE set are of type default integer, default real, double
precision, default complex, default logical, or numeric sequence type.
- Add standards warning for assignment to the host associated
variable in a PURE function.
- Add standards warning for using a dummy argument in a
specification-expr as the argument of one of the intrinsic functions
BIT_SIZE, KIND, LEN, or the numeric inquiry functions.
- Compiling BLOCK DATA with
-recursive
no longer causes a compiler internal error.
- A special usage of equivalenced variables in parallel no longer
causes a compiler internal error.
- DO loop variables are now set to be PRIVATE by default in a
parallel region.
- The scope of C$CHUNK and C$MP_SCHEDTYPE directives is restricted to
one program unit.
- Fix a bug in a special usage of passing internal procedure as
argument.