Skip to content

vmagnin/coarray_examples

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

A Buddhabrot computed with co_sum() and saved in a PPM file

For the moment, this repository contains only one example (but you may also be interested by exploring_coarrays).

ppm_coarray_buddhabrot.f90 is a CLI program drawing a Buddhabrot in a portable pixmap binary format (PPM) file, a very basic uncompressed image file format. Each Fortran image is computing its own Buddhabrot, and they are finally summed using the co_sum() collective subroutine. The process is therefore very similar to what is done in astrophotography.

The Buddhabrot

In the Buddhabrot, the intensity of a pixel is proportional to the number of times it was visited by the $z_n$ complex sequence defining the Mandelbrot set, considering only sequences starting from points not in the Mandelbrot set (and therefore diverging $z_n$ sequences).

Instead of partitioning the complex plane in several images, we have chose to simply use a Monte Carlo algorithm: each image is computing a lot of $z_n$ sequences using $c$ random complex values. At the end, all the results are summed using the co_sum() collective subroutine.

You can modify the contrast by setting the multiplication factor parameter used in the grey level computation.

You can also study the Anti-Buddhabrot by reversing the modulus test:

    if (real(z(iterations))**2 + aimag(z(iterations))**2 < 4._wp) then

to consider only $z_n$ sequences starting from points inside the Mandelbrot set.

Compiling and executing

GFortran>=16.0

Starting from version 16, GFortran supports natively coarrays using shared memory mulithreading on single node machines:

$ gfortran -Ofast -fcoarray=lib ppm_coarray_buddhabrot.f90 -lcaf_shmem && ./a.out

The -lcaf_shmem is necessary until a -fcoarray=shared option is added in a later GFortran release.

You can force the number of images (8 for example) with:

$ export GFORTRAN_NUM_IMAGES=8

You can also add the -march=native -mtune=native options for further optimization.

GFortran<16

You needed to install OpenCoarrays and type that command (8 images here):

$ caf -Ofast ppm_coarray_buddhabrot.f90 && cafrun -n 8 ./a.out

Intel ifx

$ ifx -Ofast -coarray ppm_coarray_buddhabrot.f90 && ./a.out

The number of images can be set with the option -coarray-num-images=8.

Flang

Flang 22.1 offers an experimental support for coarrays with the option -fcoarray.

TODO

  • The loop computing z(k) could be stopped by exit when we escape the computing window containing the whole Mandelbrot set. But the value of the counter should be memorized.
  • We could use the symmetry of the Buddhabrot to improve computing.
  • We could add colours instead of grey levels.

License

Distributed under the MIT license.

References

About

Modern Fortran examples using parallel features like coarrays, collective subroutines, etc.

Topics

Resources

License

Stars

4 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors