Part 1: Compilation, running

This page covers how to download, compile, and run the example code.

Downloading the code

To download the code you will need to clone the repository. To do this execute the following command:

git clone https://github.com/EPCCed/EPCC-Exercises

Compiling the code

Enter the directory and compile the code using the Makefile.

cd fractal
make

The compiled program will be called fractal.

Initial run

The fractal program is designed to be run in parallel using MPI. If you try and run it in serial it will print an error message:

./fractal

ERROR: need at least two processes for the task farm!

To run using MPI you will need to submit a job to the compute nodes.

The output will look similar to the output below:

--------- CONFIGURATION OF THE TASKFARM RUN ---------

Number of processes:			 17
Image size:			 768 x 768 
Task size:			 192 x 192 (pixels)
Number of iterations:		 5000
Coordinates in X dimension:	 -2.000000 to 1.000000
Coordinates in Y dimension:	 -1.500000 to 1.500000
Fractal function is:		 Mandelbrot set

-----Workload Summary (number of iterations)---------

Total Number of Workers: 16
Total Number of Tasks:   16

Total   Worker Load: 498023053
Average Worker Load: 31126440
Maximum Worker Load: 156694685
Minimum Worker Load: 62822

Time taken by 16 workers was 1.212222 (secs)
Load Imbalance Factor: 5.034134


The fractal executable will take a number of parameters and produce a fractal image in a file called output.ppm. By default the image will be overlaid with blocks in different shades, which correspond to the work done by different processors. This way we can see how the tasks were allocated. An example of this is presented in figure 1 – the image is divided into 16 tasks (squares) and different shade corresponds to each of 16 workers.

Fractal output.ppm{: style=”width:500px;height:auto”}

Example output image created using 16 workers and 16 tasks.

The default run scripts do the following:

srun -n 17 ./fractal -t 192

This creates a task farm with one master process and 16 workers. The master divides the image up into tasks, where each task is a square of the size of 192 by 192 pixels. The default image size is 768 x 768 pixels, which means there is exactly one task per worker, i.e. we are not yet doing anything to balance the load. Note that we control the number of tasks through the task size. (#SBATCH --tasks-per-node=<N>, or srun -n <N>, or mpirun -np <N>).

The load of a worker is estimated as the total number of iterations of the Mandelbrot calculation summed over all the pixels considered by that worker. The assumption is that the time taken is proportional to this. The only time that is actually measured is the total time taken to complete the calculation.

You can view the output file using display output.ppm, an example of which is found in figure 1. If you want to see how the image looks without the shading use the –n option to the fractal program - see the following parameter section for more details.

Fractal program Parameters

The following options are recognised by the fractal program:

  • -S number of pixels in the x-axis of image

  • -I maximum number of iterations

  • -x the x-minimum coordinate

  • -y the y-minimum coordinate

  • -f <fractal function> set to J for Julia set

  • -c the real part of the parameter c+iC for the Julia set

  • -C the imaginary part of the parameter c+iC for the julia set

  • -t task size (pixels x pixels)

  • -n do not shade output image based on task allocation to workers