- Except as noted under Known Issues, libcaf_mpi supports the following features as described
in the Fortran 2008 standard:
- allocatable and non-allocatable coarrays of intrinsic or derived type
- synchronization statements
- atomics
- locks
- critical
- Except as noted under Known Issues, libcaf_mpi supports the collective subroutines proposed for Fortran 2015 in the draft Technical Specification TS 18508 Additional Parallel Features in Fortra subroutines for a limited set of intrinsic types and kinds. Adding additional types and kinds is straightforward. Please submit a request via the Issues page or consider adding the requisite code by forking the OpenCoarrays repository and submitting pull request via GitHub. Also see [CONTRIBUTING.md] for more information.
The OpenCoarrays CMake build and test scripts detect the compiler identity, version, and operating system (OS). The scripts use this information to build and test the approproiate functionality for the compiler and OS. Each current compilers' status falls into one of three categories:
* **OpenCoarrays-Aware (OCA) Coarray Fortran (CAF) Compilers** * _Definition:_ The compiler translates CAF statements into OpenCoarrays application binary interface ([ABI]) calls. * _Example_: GNU Fortran 5.1 or later (see [https://gcc.gnu.org/wiki/Coarray] for the compiler's CAF status.. * _Use case_: compile most Fortran 2008 coarray programs and some programs that use proposed Fortran 2015 features. * **Non-OCA CAF Compilers** * _Definition:_ The compiler supports CAF but does not generate calls to the OpenCoarrays ABI. * _Examples_: Cray compiler (except on CS Series clusters), Intel compiler (except on OS X). * _Use case_: extend the compiler's native CAF using the [opencoarrys module] types and procedures. * **Non-CAF Compilers** * _Definition_: The compiler provides no direct support for CAF, but the user can access a subset of CAF features via use association with the [opencoarrays module], e.g., `use opencoarrays, only : co_sum`. * _Examples_: GNU Fortran 4.9 or any compiler not mentioned above. * _Use case_: Use the OpenCoarrays "caf" compiler wrapper to compile those CAF programs for which the proposed Fortran 2015 collective subroutines cover all of the application's communication requirements.We have encountered several research applications that match the latter use case. If you encounter difficulties, please submit a bug report or feature request via the Issues page. Also submit a feature request to the relevant compiler technical support.
The OpenCoarrays team offers contract development and support for making compilers OpenCoarrays-aware. If this is of interest, please inform the compiler's technical support as well as the OpenCoarrays team. To contribute code, including documentation and tests, see the [CONTRIBUTIONS] file. To contribute funding, including funding in support of feature reqeusts, see the Sourcery Store.
## Library Status ## * **libcaf_mpi** (Default CMake build): Production transport layer that uses the Message Passing Interface (MPI) 3.0 one-sided communication, which exploits a hardware platform's native support for Remote Direct Memory Access (RDMA) if available. * **libcaf_x** (where x = [CUDA], [OpenMP], [Pthreads], [OpenSHMEM], etc.): the OpenCoarrays [ABI] design facilitates implementation atop any one of several low-level parallel programming models, vectorization APIs, or combination thereof. We have performed limited evaluations and research development of versions based on multiple APIs. Please email the [OpenCoarrays Google Group] for support with targeting other APIs and hardware, including, for example, graphics processing units (GPUs) and heterogeneous CPU/GPU platforms. * **libcaf_gasnet** (Advanced Make build): Experimental transport layer that is currently out-of-date but might exhibit higher performance than MPI on platforms for which GASNet provides a tuned conduit. Contact the [OpenCoarrays Google Group] for further information. * **libcaf_armci** (Unsupported): developed for research purposes and evaluation. * **libcaf_single** (Unsupported): developed to mirror the like-named library that is included in GNU Fortran to facilitate compiling single-image (sequential) executables from CAF programs in the absence of a parallel communication library. ## Known Issues ## ### Library Issues ### * The [opencoarrays module] and "caf" compiler wrapper do not support the square-bracket syntax required for point-to-point communication. This limitation only impacts [non-CAF compilers]. For a list of other limitations with non-CAF compilers, execute the "caf' bash script with no arguments. The "caf" script is installed in the "bin" subdirectory of the installation path. * Efficient strided array transfer works only for intrinsic types. * Efficient strided array transfer is not supported for remote-to-remote transfers. * Overwriting a coarray with itself is not managed efficiently for strided transfers. * Communication * Vector subscripts are not yet supported * For character assignments, some issues with padding and character kind conversions exist. * For array assignments, some issues with numeric type conversion exist. ### Compiler Issues ### * **GNU** (gfortran) * Derived-type coarrays with allocatable/pointer components are not yet handled properly. * Problems exist with combining array access to a corray with a scalar component access as in `coarray(:,:)[i]%comp`. * An internal compiler error (ICE) occurs with non-allocatable, polymorphic coarrays in `associate` or `select type` statements. * `co_reduce` with GCC 5 and 6 requires patches committed on 17 July 2015 and will work with the GCC 5.3.0 and 6.1.0 releases. * `co_reduce` only supports arguments of intrinsic type. * No support for type finalization or allocatable components of derived-type coarrays passed to the collective subroutines (e.g., `co_sum`, `co_reduce`, etc.). * Optimization levels other than -O0 introduce correctness errors in the compiled binaries. A patch has been submitted by @afanfa to the GFortran team. See #28 for some more context. * **Intel** (ifort) * Supported via the [opencoarrays module] only. * **Cray** (ftn) * Supported via the [opencoarrays module] only. * **Numerical Algorithms Group** (nagfor) * Supported via the [opencoarrays module] only. * **Portland Group** (pgfortran) * Supported via the [opencoarrays module] only. * **IBM** (xlf) * Supported via the [opencoarrays module] only. ## To-Do List ##- Additional tests and documentation.
- Improvement of error handling and diagnostics, including but not limited to filling the ERRMSG= variable in case of errors.
- Providing a diagnostic mode with run-time consistency checks.
- Better integration with the test cases of GCC. For more information, see the GCC source code files in gcc/testsuite/gfortran.dg/, in particular, the "dg-do run" tests in coarray*f90 and coarray/).