3.6 KiB
CS 5030 Final Project
This is GOL. That's it.
There are multiple implementations in this project. Each one uses the same code, just modified slightly. Each directory contains a Makefile which will build that implementation. For most, a simple cd
into each directory and make
will do (see build instructions).
Every make
will end you up with a gol
binary. However, each implementation takes a different number of arguments (the Cuda one needs to be run in a slightly different fashion).
Compiling binary output to a video
Every implementation produces file I/O exactly the same. When logging is turned on, each iteration in the output directory is labelled iteration-XXXXXXX.bin
where iteration number is padded by 7 zeros.
There is a script in graphics
that converts a raw unsigned char
data binary into a .bmp where a zero is black and (with some help from this Stack Overflow post). This program is utilized by make-movie.sh
to convert every .bin in a directory to a .bmp. Then, these .bmps can be compiled into a video file with the arguments that are described in make-movie.sh
(just provide none and a usage string will be ~echo~ed).
For example to make a movie of the outputs generated in cuda-global/output
where each binary file is a grid of size 1920x1080 (at 8fps to a file named output-1920.mp4):
cd graphics
make
(On CHPC you will need to module load ffmpeg
)
./make-movie.sh ../cuda-global/output 1920 1080 8 output-1920
Building
MPI
Firstly, module load gcc mpich
. Then cd
into mpi
and make
.
Then, you can run with
mpirun -np <cores> ./gol simulate <filename | random> <width> <height> <iterations> <log-each-step?1:0>
Cuda
Firstly, cd
into cuda-global
and make
.
Then start an interactive gpu session on notchpeak:
salloc -n 1 -N 1 -t 0:10:00 -p notchpeak-shared-short -A notchpeak-shared-short --gres=gpu:k80:1
This implementation takes these arguments:
srun ./gol simulate <filename | random> <width> <height> <iterations> <log-each-step?1:0>
For example to do 1000 iterations at 1920x1080 with a random starting position (the last 1
will log each iteration into the output
directory) with a block size of 32:
srun ./gol simulate random 1920 1080 1000 1 32
OpenMP
Firstly, cd
into openmp
and make
.
This implementation takes these arguments:
./gol simulate <filename | random> <width> <height> <iterations> <log-each-step?1:0> <num_threads>
For example to do 100 iterations with 8 threads at 800x600 with a random starting position (and log each iteration into the output
directory):
./gol simulate random 800 600 100 1 8
Serial
The most basic of the three implementations.
Firstly, cd
into serial
and make
.
This implementation takes these arguments:
./gol simulate <filename | random> <width> <height> <iterations> <log-each-step?1:0>
For example to do 10 iterations with 8 threads at 400x400 with a random starting position (and log to output
):
./gol simulate random 400 400 10 1
Creating an initial starting grid
Each gol
binary also has a create-grid
mode, mainly used for debugging:
./gol create-grid <width> <height> <filename>
You'll be prompted to enter in grid values (0/1) for each row, each seperated by a space.
For example to make a 10x10 grid and output it to output/testing.bin
:
./gol create-grid 10 10 output/testing.bin
And then this file can be used in the filename
argument when using simulate
.