Skip to content

Fortran with coarrays

Fortran is perhaps the only programming language with standard support for distributed memory programming: Since the 2008 standard, coarrays are a part of the language standard.

On DelftBlue, coarrays are supported via the GNU fortran compiler and an additional module built on top of MPI.

  1. Load necessary modules:
    module load 2025
    module load openmpi
    module load opencoarrays
    
  2. Compile and link your code using the caf compiler wrapper, (adding any regular gfortran flags, like -O3 or -g):
    caf yourcode.f90 -o yourcode.x
    
  3. Inside a job, use srun to start your application, just as if it were an MPI program:

        srun yourcode.x
    

  4. To run your code interactively (e.g., on the login node for testing):

    mpirun -np 4 yourcode.x
    

You will notice that the following warning is printed multiple times:

tag_match.c:62   UCX  WARN  unexpected tag-receive descriptor 0xc52200 was not matched
The warning is likely caused by underlying one-sided MPI routines forcing themselves on the InfiniBand interface library UCX, and nothing to worry about. In the example below we filter the warning to avoid cluttered output.

Alternatively, if you intend to stay within the single node only, disabling the UCX functionality altogether might be an option:

export OMPI_MCA_pml=^ucx

Hello World example

The following code prints a message from every process ("image") on the first image:

caf_hello.f90
program hello

implicit none

integer :: i
integer :: rank_to_print[*]


! say hello

do i=1,num_images()
  if (i==this_image()) then
    rank_to_print[1]=this_image()
  end if
  sync all
  if (this_image()==1) then
    write(*,*) 'Hello from image',rank_to_print,'out of',num_images()
  end if
  sync all
end do

sync all

! say goodbye

do i=1,num_images()
  if (i==this_image()) then
    rank_to_print[1]=this_image()
  end if
  sync all
  if (this_image()==1) then
    write(*,*) 'Goodbye from image',rank_to_print,'out of',num_images()
  end if
  sync all
end do
end program hello

Example submission script that compiles and runs the program:

caf_hello.slurm
#!/bin/bash
#SBATCH --ntasks=5
#SBATCH --cpus-per-task=1
#SBATCH --account=innovation
#SBATCH --partition=compute
#SBATCH --time=00:01:00
#SBATCH --mem-per-cpu=1GB
#SBATCH --output=caf_hello.out

# Load necessary modules:
module load 2025
module load openmpi
module load opencoarrays
                    ```
# Compile your code: using the 'caf' compiler wrapper
caf -O3 caf_hello.f90 -o caf_hello.x
                                ```
# Run the code on 5 CPU cores:
srun ./caf_hello.x |grep -v UCX