Releases: stfc/PSyclone
Release 3.0
What's Changed
IMPORTANT: graphviz
and termcolor
are now mandatory dependencies (rather than optional). You will need these python packages installed in order to run psyclone.
The functionality for handling existing Fortran code which we used to term the "NEMO API" is now named "Generic Code Transformation". All NEMO-specific naming has been removed from the codebase. This change has been made to emphasise
that this functionality is intended to be general purpose. As part of this, the concept of a 'default' API has been removed since
the default is now to process generic code. If a user has code that conforms to an API then they must specify which one using
the -api/--psykal-dsl
flag to PSyclone.
LFRic and PSyAD
- More moving and renaming of classes out of
dynamo0p3.py
; - Use of the PSyIR Fortran backend for LFRic loops and anything inside them;
- Comments generated for Builtins in the PSy Layer;
- Support for user-defined kernels that operate on DoFs;
- GungHo on GPU now part of integration tests;
- LFRic PSy-layer now looks up nlevels for each kernel individually;
- Update the PSyKAl transformation script signature to accept PSyIR nodes;
- Add support for kernels that operate on halos (for FFSL in LFRic);
- Derive module and subroutine names of adjoint tests from supplied filename for LFRic API;
- Improvements to kernel-extraction and driver-generation (PSyKE) functionality (including MPI support);
- NaN-checking support generalised so that kernel inputs can be checked for validity against user-provided ranges;
- Updates to support new operator index ordering in LFRic;
NEMO
- Passthrough of BENCH for NEMOv4 now requires only one file to be omitted;
- Passthrough of BENCH for NEMOv5 works for all source files;
- OpenACC and OpenMP offload to GPU for both versions now part of integration testing;
- Several bug fixes for issues around incorrect parallelisation of loops;
Generic Code Transformation
-
New support for Fortran features:
- NAMELIST
- SELECT TYPE
- Procedure interfaces
- Calls to type-bound procedures
- INTRINSIC modules and USE association
- ELEMENTAL and IMPURE routines
- Pointer assignments
- WHERE without explicit array notation
- OPTIONAL arguments - partial type information now retained
- Calls to polymorphic routines
-
Improved support for inlining and "module inlining".
-
The reason for a CodeBlock is now included as a comment in the output Fortran code;
-
Improved lifetime analysis (used to improve robustness of loop parallelisation);
-
Many bug fixes and improvements;
-
Improvements to various intrinsic-to-code transformations;
-
Initial support for array-privatisation in parallel-loop transformations;
Other
- Experimental backend for xDSL Python-Native Compiler Toolkit
- PSyclone performance improvements
- Updated to use release 0.2.0 of fparser (https://github.com/stfc/fparser)
Full Changelog: 2.5.0...v3.0
New Contributors
- @JulienRemy made their first contribution in #2567
- @mcjamieson made their first contribution in #2653
- @DrTVockerodtMO made their first contribution in #2743
- @schreiberx made their first contribution in #2775
Full Changelog: 2.5.0...v3.0
Release 2.5.0
What's Changed
LFRic and PSyAD
- Much renaming and moving of LFRic-related classes from 'dyn' to 'LFRic';
- PSy-layer generation now creates array pointers for use as kernel arguments (required for GPU compilation);
- Bug fix for missing maps in
enter data
directive; - Bug fixes for LFRic dependency analysis;
- PSyKE: use proper NetCDF variable names for array of fields;
- Metadata support for multi-precision kernels;
- Bug fix for PSy-layer generation involving CMA operators;
- All LFRic built-ins are now generated using PSyIR and lowering;
- Precision-map values moved to configuration file;
- New real-to-real conversion built-in;
- Generated PSyAD test harness now uses LFRic logging API;
- Bug fix for
setop_random
kernel.
NEMO
- Support for OpenMP tasking transformation and directive;
- Supported added for OMP/ACC Atomics and OMP Simd directives;
- Bug fix for
VERIFY
intrinsic; - Fix
Ref2ArrayRangeTrans
bug withALLOCATE
statements; - Addition of NEMO OpenACC loops transformation script;
NemoKern
node removed;maxval2loop
and atomics used to parallelise NEMOstpctl.f90
;- Bug fix for
NemoOuterArrayRange2LoopTrans
; - Bug fix for
process_nemo.py
script: ensure-I
flags are aggregated.
PSyIR Improvements
- Add
Node.siblings
property; - Add
depth
kwarg toNode.walk
; - Add
Node.get_sibling_lists
method; Node.origin_string
method to retrieve original filename and line number information;- Improvements to
ACCRoutineTrans.validate()
; - Improvements to
maxval
-,minval
- andsum
-to-code transformations; - Allow PSyIR backend consistency checks to be disabled;
- Improvements to
InlineTrans
andLoopFusionTrans
; - Support for querying the datatype of a unary/binary operation;
UnknownType
renamed toUnsupportedType
andDeferredType
toUnresolvedType
;same_range
functionality moved toArrayMixin
plus other improvements.
Fortran PSyIR Frontend
- Add support for
SAVE
statement andDO CONCURRENT
; - Put WHEREs containing reductions into
CodeBlocks
and fix non-unity lower-bound bug; - Bug fixes for handling of Fortran types;
- Catch unsupported statements in
implicit-part
of parse tree.
Full Changelog: 2.4.0...2.5.0
2.4.0
What's Changed
LFRic
- Significant progress towards fully-automatic driver generation for extracted kernels (using PSyIR);
- Support for standalone and NetCDF kernel extraction;
- Significant progress towards generating PSyIR for the Algorithm layer;
- Many classes have been moved out of the (extremely large) dynamo0p3.py file and renamed (replacing "Dyn" with "LFRic");
- New setval_random built-in;
- Bug fixes to KernelModuleInlineTrans;
- New kernel metadata handling;
- Support for new field/operator precisions (e.g. r_solver, r_trans etc.)
- Invoke names now constrained to be valid Fortran names;
- Add compilation support to lfric/eg14 (OpenACC example);
- Allow for GH_WRITE access to arguments to inter-grid kernels;
PSyAD
- Assorted bug fixes (including kind parameter declarations, routine naming, unary minus operators);
- Application to Functions now forbidden;
- LFRic-specific support added;
- New ReferenceToArrayTrans transformation;
- Support for test-harness generation (both generic and LFRic-specific);
- Support for LFRic kernel arguments containing geometry information;
- Selection of LFRic tangent-linear kernels added under examples;
PSyIR
- Improvements to dependence analysis (induction variables, variables with names matching Sympy reserved names)
- New HoistLoopBoundExprTrans transformation;
- New routine-inlining transformation (including support for routines in a different Container);
- Support for new OpenMP tasking transformations;
- Improvements to support of OpenMP Target directives;
- Improvements to identification of private, firstprivate etc. attributes on OpenMP directives;
- SIR backend - support for intrinsics;
- Bug fix to DotproductTrans;
- New Sum2CodeTrans and {Min,Max}Val2Code transformations;
- Support for OpenMP 'teams distribute parallel do' directive;
- Improvements to SymbolTable functionality;
- Add support for static/save Symbol attribute;
- Support for Symbols that are renamed upon import;
- New HoistLocalArraysTrans;
- Addition of 'force' option to ParallelLoopTrans;
- New 'is_independent' method added to Loop to encapsulate dependence analysis;
- Support for ACC ENTER DATA and ACC UPDATE directives (data movement);
- Support for GANG and VECTOR clauses on ACC LOOP directive;
- New ACCClause nodes for specifying data movement;
- New automatic tree-update mechanism to allow ancestor nodes to update if their descendants change;
- New 'IntrinsicCall' node type used for all intrinsics (previously, some were Operations);
- All Fortran2018 intrinsics now supported;
- Fortran 'INCLUDE' statements are now forbidden (must be handled by fparser);
- Support for Fortran parameter statements;
- Support for Fortran declarations containing initialisation expressions;
- Support for Fortran 'DO WHILE' loops;
- Generic "kernel" extraction support;
- Support for assumed-shape arrays;
- Bug fix to handling of USE statements in Fortran backend;
- Improved support for Fortran INTERFACEs;
- Support for Fortran Common blocks;
- Support for 'elemental' and 'pure' Routines;
- Bug fixes for Routines CONTAINed within other Routines in Fortran;
- Added support for Fortran EQV operator;
- Bug fix for SELECT CASE involving a logical variable;
- UnknownFortranType extended to allow capture of known type information;
- Support for the use of array expressions and derived types in Sympy;
- Improvements to Node.ancestor() and new Node.path_from() method;
GOcean
- New kernel metadata handling;
- Support for OpenMP tasking;
General
- Fix to locations searched for PSyclone config file;
- Improve CLI --version interface;
- Remove constraint that supplied Fortran is free-form;
- Update to fparser 0.1.3;
- Improvements to NEMO training/tutorial material;
- Fixes to the handling of compiler flags for the libraries, examples and tutorials;
- Bug fixes to the line-length limiting module to avoid generation of lines containing only whitespace and a line-continuation character;
- Support for logical data in PSyData;
- Support for the Tau profiler using the PSyData interface;
- PSyclone integration testing implemented - correctness and performance tested for both LFRic and NEMO.
New Contributors
- @matthewrmshin made their first contribution in #1997
- @svalat made their first contribution in #2014
- @mo-lottieturner made their first contribution in #2098
- @BHFock made their first contribution in #2123
- @jwallwork23 made their first contribution in #2259
- @oakleybrunt made their first contribution in #2260
Full Changelog: 2.3.1...2.4.0
Release 2.3.1 (bug fix to 2.3.0)
This is essentially a bug-fix release. The primary change is to adopt fparser 0.0.16 in which the symbol-table consistency checks
are now disabled by default (pending further development work).
What's Changed
- Update to use fparser 0.0.16 (with symbol-table validation disabled)
- psyad ifs [closes 1720] by @rupertford in #1747
- (Closes #450) remove set_dirty/clean from ACC regions. by @arporter in #1669
- (towards #1731) Split PSyLoop node from Loop by @sergisiso in #1745
Full Changelog: 2.3.0...2.3.1
PSyclone 2.3.0
What's Changed
LFRic Functionality
- Support for mixed precision.
- Support for new built-ins (min/max, scalar subtraction and division by a scalar).
- Fix for halo exchange bug involving stencil depths.
- GH_WRITE access for fields on continuous spaces is now permitted in certain special circumstances.
- Access to CMA Operators has been updated to match the latest LFRic infrastructure.
Core PSyclone Functionality
- Significant improvements to the dependence-analysis functionality.
- Parameter declarations are now ordered so as to satisfy those compilers that do not obey the Fortran standard.
- Improvements to the Node.view() functionality.
- Nodes now support checking for equality.
- Extension to PSyIR towards supporting named routine arguments.
- Support for Algorithm-layer PSyIR.
- Extension and bug-fixes to matmul transformation.
- Bug fixes and improvements to Symbol Table functionality.
PSyAD
- PSyAD now supports expansion of expressions involving active variables.
Full Changelog: 2.2.0...2.3.0
Release 2.2.0
What's Changed
LFRic:
- All loop-bounds lookups in the LFRic PSy layer are done before the loops themselves. This removes type-bound procedure calls from those loops which will facilitate acceleration with e.g. OpenACC.
- The kernel-stub generator (
gen_kernel_stub
) functionality has moved and is now available as part of the newpsyclone-kern
command. - Work towards supporting mixed precision in the LFRic API. Precision for kernel arguments is now obtained by interrogating the Algorithm layer.
- All LFRic built-ins (barring those that do reductions and type casting) are now constructed using PSyIR.
NEMO:
- Improvements to the PSyIR to better support object-orientated style Fortran.
- Various bug fixes related to the construction and use of PSyIR for NEMO, MEDUSA and NEMOVAR, particularly for structures of arrays.
- New ACCRoutineTrans and OMPTargetTrans transformations to allow routines to be flagged for compilation for a remote device.
- New HoistLocalArraysTrans transformation which transforms local, automatic arrays into module scope allocatables.
GOcean:
- An example of the use of the PSyData API for checking for NANs before and after kernels has been added.
- OpenCL functionality has been moved out of code generation and into code transformations in order to improve code structure.
- Kernel data extraction can now create a stand-alone driver to read in the data, execute the kernel and verify the results.
PSyclone Adjoint generator (PSyAD):
- Various improvements including support for dot_product and matmul intrinsics.
General:
- Loop blocking and tiling transformations have been added.
- Support for Python 2 has been removed. Testing is now performed for Python 3.6, 3.8 and 3.10.0.
- Dependence analysis now utilises SymPy.
- Parallel-loop transformations now check for loop-carried dependencies.
- Dynamo 0.1 and GOcean 0.1 APIs have been removed.
- Improved representation of directive clauses in the PSyIR.
- GitHub Actions now performs link checking for all Sphinx documentation as well as running the doctests in the Developer Guide.
Detailed changes:
- Changelog: https://github.com/stfc/PSyclone/blob/master/changelog
- Code changes between 2.1 and 2.2: 2.1.0...2.2.0