phas0102-techniques-of-high-performance-computing-21-22-'s Introduction
phas0102-techniques-of-high-performance-computing-21-22-'s People
phas0102-techniques-of-high-performance-computing-21-22-'s Issues
AAA
PHAS0100ASSIGNMENT1
Purpose
This project serves as a starting point for the PHAS0100 2021/22 Assignment 1 Game of Life Simulation coursework. It has a reasonable folder structure for CMake based projects,
that use CTest to run unit tests via Catch.
Further information on the specific project is left as an exercise for the student.
Credits
This project is maintained by Dr. Jim Dobson. It is based on CMakeCatch2 that was originally developed as a teaching aid for UCL's "Research Computing with C++"
course developed by Dr. James Hetherington
and Dr. Matt Clarkson.
Build Instructions
Contents
Introduction
How to build
How to use golSimulator
How to use golStillLifes
How to run tests
Introduction
Welcome to the C++-based Conway's "Game of Life".
-
In this project, to specifically investigate the way Conway's "Game of Life" evolves, we have provided the command line application
golSimulator
to implement two input methods (file input mesh, random initialisation mesh) and thus Create a grid of your choice. Based on this grid, you can specify the number of iterations and print out the results of each iteration according to Conway's "Game of Life" rules. The result is printed out. -
In this project, a command line application
golStillLife
is provided in order to explore the way still life (i.e. a mesh that has not changed anything between iterations and is not completely empty) evolves. This application generates a number of random meshes based on the parameters you enter, and performs a process based on Conway'sGame of Life
rules and eventually prints out a grid that matches the definition of a still life. -
In addition, we provide a unit testing application
golGameGridTest
based on CTest and Catch for unit testing the game grid class.
Next, the parameter rules and how to use them are described in the next three chapters.
How to build
First, go to the root directory of the file with the help of the IDE's terminal.
mkdir build
cd build
The project is compiled based on Cmake. Therefore, if you are using it for the first time, simply enter the following command line in the newly created build directory.
cmake ..
make
Normally the program takes close to a minute to compile. When the compilation is complete, you will see the following output.
[ 28%] Built target PHAS0100ASSIGNMENT1
[ 38%] Built target golStillLife
[ 47%] Built target golSimulator
[ 57%] Built target golMyFirstApp
Scanning dependencies of target golGameGridTest
[ 61%] Building CXX object Testing/CMakeFiles/golGameGridTest.dir/golGameGridTest.cpp.o
[ 66%] Linking CXX executable ../bin/golGameGridTest
[ 71%] Built target golGameGridTest
[ 85%] Built target golCommandLineArgsTest
[100%] Built target golBasicTest
How to use golSimulator
After compiling, follow the rules below to use the command line application golSimulator
.
The application golSimulator
provides the user with two ways to build a grid.
1. text input
You can specify an input file and thus build a grid of your choice. Based on this mesh, you need to specify the number of iterations.
The input command has two parameters, the file path and the number of iterations to be attempted. Example.
./bin/golSimulator ./Testing/Data/glider.txt 3
The above command represents our determination that the input file is . /Testing/Data/glider.txt
. Based on this file, the mesh we build will go through 3
iterations.
Normally, you would see output like this!
----------
--o-------
o-o-------
-oo-------
----------
----------
----------
----------
----------
----------
<----------Inter-iteration-separator---------------->
----------
-o--------
--oo------
-oo-------
----------
----------
----------
----------
----------
----------
<----------Inter-iteration-separator---------------->
----------
--o-------
---o------
-ooo------
----------
----------
----------
----------
----------
----------
<----------Inter-iteration-separator---------------->
2. Random initial grid
You can customise the size of the specified grid and the total number of initial live cells to be placed, thus creating a randomised generated grid. Based on this grid, you need to specify the number of iterations and the grid will loop as many times as you specify and print out the current grid.
The input command has 4 parameters, rows, columns, the number of live cells and the number of iterations for each grid. Example.
./bin/golSimulator 20 12 30 3
This means we will generate an initialised grid with 30
surviving cells with a width of 20
and a height of 12
, and follow the rules for 3
iterations.
Normally, you would see similar output!
--o----o------o--o--
----o-o-------o----o
----o-o-------------
------o-------------
---------o-----o----
--- oo-------o-------
------------------o-
--------o-------o--
--- oo-----o------o--o-
oo---------o--------
-------------------o
---------o-------oo-
<----------Inter-iteration-separator---------------->
--------------------
---o--oo ------------
------oo------------
-----o--------------
--------------------
--------------------
--------------------
-----------------o--
oo------------------
oo------------------
------------------o-
------------------o-
<----------Inter-iteration-separator---------------->
--------------------
------oo------------
-----o-o------------
------o-------------
--------------------
--------------------
--------------------
--------------------
oo------------------
oo------------------
--------------------
--------------------
<----------Inter-iteration-separator---------------->
How to use golStillLifes
You can customize the size of the specified grid and the total number of initial live cells to be placed, thus creating a number (maximum 10
) of randomized generated grids. For each grid, you need to specify the number of iterations. During these times, the program will check if the mesh meets the still life criteria and print all still life.
The input command has 4 parameters, rows, columns, the number of surviving cells and the number of iterations for each grid. Example.
./bin/golStillLifes 4 4 6 10
This means that we will generate an initialized grid with 6
survival cells with a width of 4
and a height of 4
and follow the rules for 10
iterations.
Normally, you would see output like this!
--o-
-o-o
-o-o
--o-
<----------Inter-iteration-separator---------------->
----
----
oo--
oo--
<----------Inter-iteration-separator---------------->
--oo
-o-o
--o-
----
<----------Inter-iteration-separator---------------->
----
-oo-
o--o
-oo-
<----------Inter-iteration-separator---------------->
--oo
-o-o
--o-
----
<----------Inter-iteration-separator---------------->
----
----
oo--
oo--
<----------Inter-iteration-separator---------------->
-o--
o-o--
o-o-
-o--
<----------Inter-iteration-separator---------------->
--oo
-o-o
--o-
----
<----------Inter-iteration-separator---------------->
As you can see, out of the 10
random initialization grids, we found 8
still lifes.
How to run tests
In addition, we also provide the unit testing application golGameGridTest
for unit testing the game grid class.
You can use it with the following command!
./bin/golGameGridTest
BBB
PHAS0100Assignment2
Purpose
This project serves as a starting point for the PHAS0100 Assignment 2 Gravitational N-body Simulation coursework. It has a reasonable folder structure for CMake based projects,
that use CTest to run unit tests via Catch.
Further information on the specific project is left as an exercise for the student.
Credits
This project is maintained by Dr. Jim Dobson. It is based on CMakeCatch2 that was originally developed as a teaching aid for UCL's "Research Computing with C++"
course developed by Dr. James Hetherington
and Dr. Matt Clarkson.
Build Instructions
Contents
Introduction
How to build
How to use solarSystemSimulator
How to use openMpSystemSimulator
How to run tests
Energy comparison based on solarSystemSimulator
Benchmark results based on solarSystemSimulator
Benchmark results based on openMpSystemSimulator
Introduction
Welcome to N-body gravity simulation built in C++.
-
This project realizes the simulation of particle motion in the presence of N-body gravitation, and extends it to the motion of various celestial bodies. In this project, we designed the command line program
solarSystemSimulator
. Furthermore, we designed the command line programopenMpSystemSimulator
. Based on the above design, we also conduct benchmarking and accuracy verification. -
Specifically, first of all, we designed the Particle class and MassiveParticle class to simulate the motion principle of particles. After that, in order to generate particle clusters of different modes, we also designed
Generator
class,SolarSystemGenerator
class andRandomParticleClusterGenerator
class to generate different kinds of particle clusters. After that, we developed the command-line programsolarSystemSimulator
to simulate the motion of various celestial bodies in the solar system. After that, we developed the command-line programopenMpSystemSimulator
to implement N-body motion simulation of random particle clusters optimized byOpenMp
parallelization. -
In addition, we provide a unit testing application
nbsimSystemSimulatorTest
based on CTest and Catch for unit testing the Particle class and the MassiveParticle class.
The last three chapters will be used to present the benchmark results and accuracy test results of the program.
How to build
First, go to the root directory of the file with the help of the IDE's terminal.
mkdir build
cd build
The project is compiled based on Cmake. Therefore, if you are using it for the first time, simply enter the following command line in the newly created build directory.
cmake..
make
Normally the program takes close to a minute to compile. When the compilation is complete, you will see the following output.
Scanning dependencies of target phas0100assignment2
[ 7%] Building CXX object Code/Lib/CMakeFiles/phas0100assignment2.dir/nbsimParticle.cpp.o
[ 14%] Building CXX object Code/Lib/CMakeFiles/phas0100assignment2.dir/nbsimMassiveParticle.cpp.o
[ 21%] Building CXX object Code/Lib/CMakeFiles/phas0100assignment2.dir/nbsimParticleGenerator.cpp.o
[ 28%] Linking CXX static library ../../bin/libphas0100assignment2.a
[ 50%] Built target phas0100assignment2
[ 57%] Linking CXX executable ../../bin/openMpSystemSimulator
[ 64%] Built target openMpSystemSimulator
[ 71%] Linking CXX executable ../../bin/solarSystemSimulator
[ 78%] Built target solarSystemSimulator
[ 85%] Linking CXX executable ../bin/nbsimSystemSimulatorTest
[100%] Built target nbsimSystemSimulatorTest
How to use solarSystemSimulator
After compiling, follow the rules below to use the command line application solarSystemSimulator
.
The command line application solarSystemSimulator
provides us with a way to simulate the motion of various celestial bodies in the solar system before and after the specified motion time. The data of each celestial body at the beginning comes from the solar system started on the epoch of 2021-01-0T00:00:00Z. You can enter parameters to control the timing and step size of its motion, and observe the energy, position results, and elapsed time of the solar system before and after the simulated motion.
The input command has two parameters, which are the number of iterations and the iteration step size. Example.
./bin/solarSystemSimulator 3650 0.000274
Among them, the input of 3650
and 0.000274
means that you want the solar system to perform 3650
iterations of simulation calculations with an iterative step size of 0.000274
years (about 0.1
days), that is, to simulate the solar system after about 1.0001
year movement.
Normally, you would see output like this!
Before the simulation starts,
The kinetic energy of the system objects is 0.187358
The potential energy of the system objects is -0.356872
The total energy of the solar system objects is -0.169514
Below are the initial positions of the solar system bodies before the simulation started.
The initial position of Sun is at:
-0.00670894
0.0060565
0.00010651
The initial position of Mercury is at:
0.230275
-0.351957
-0.0508834
The initial position of Venus is at:
-0.453178
-0.563815
0.0180571
The initial position of Earth is at:
-0.185741
0.972886
4.83111e-05
The initial position of Mars is at:
0.614263
1.38167
0.0136846
The initial position of Jupiter is at:
3.0346
-4.08225
-0.050909
The initial position of Saturn is at:
5.4834
-8.33624
-0.0732546
The initial position of Uranus is at:
15.3436
12.4673
-0.152634
The initial position of Neptune is at:
29.4537
-5.22631
-0.571104
<------------------------------------------------------ >
After the simulation ends,
The kinetic energy of the system objects is 0.222977
The potential energy of the system objects is -0.392047
The total energy of the solar system objects is -0.169071
After a simulation with a time step of 0.000274 years and a simulation time of 1.0001 years, the following are the final positions of the celestial bodies in the solar system after the simulated motion.The final position of Sun is at:
-0.00850808
0.00286806
0.000173415
The final position of Mercury is at:
-0.133503
-1.03322
-0.0742189
The final position of Venus is at:
0.171486
0.753935
7.4371e-05
The final position of Earth is at:
-0.0882755
1.00545
4.6332e-05
The final position of Mars is at:
-2.52465
1.26141
0.0881059
The final position of Jupiter is at:
4.32898
-1.39267
-0.0910706
The final position of Saturn is at:
6.83314
-6.88108
-0.152436
The final position of Uranus is at:
14.2433
13.3617
-0.135071
The final position of Neptune is at:
29.5955
-4.08302
-0.597839
CPU time used: 3.898518 s
Wall clock time passed: 3.898581 s
Among them, before starting the simulation, the kinetic energy of the system is 0.187358
, the potential energy is -0.356872
, the total energy of the solar system objects is -0.169514
. After the simulated motion, their values ββare 0.222977
, -0.392047
, -0.169071
, which basically follow the conservation of energy. In addition, the initial position of each celestial body is also printed, for example, before the motion simulation starts, the initial position of the earth is (-0.185741 0.972886 4.83111e-05)
, and after about 1 year of simulated motion, its position It is (-0.0882755 1.00545 4.6332e-05)
, which remains basically unchanged, which means that the planet has completed one revolution in a year and roughly returned to its previous position.
In addition, you can also enter the -h
or --help
identifier to see more help information.
./bin/solarSystemSimulator -h
./bin/solarSystemSimulator --help
How to use openMpSystemSimulator
Similarly, we provide the command line application openMpSystemSimulator for simulating 2000
random particles
After compiling, follow the rules below to use the command line application solarSystemSimulator
.
The command line application solarSystemSimulator
provides us with a way to simulate the motion of various celestial bodies in the solar system before and after the specified motion time. You can enter parameters to control the time and step size of its motion, and observe the energy and position results of the solar system before and after the simulated motion.
The input command has two parameters, which are the number of iterations and the iteration step size. Example.
./bin/openMpSystemSimulator 3650 0.000274
Among them, the input of 3650
and 0.000274
means that you want the cluster to perform 3650
iterative simulation calculations with an iterative step size of 0.000274
years (about 0.1
days), that is, to simulate the cluster after Movement for about 1.0001
years.
Normally, you would see output like this!
Before the simulation starts,
The kinetic energy of the system objects is 0.0186525
The potential energy of the system objects is -1.51196
The total energy of the solar system objects is -1.49331
<------------------------------------------>
After the simulation ends,
The kinetic energy of the system objects is 0.0186525
The potential energy of the system objects is -1.51196
The total energy of the solar system objects is -1.49331
CPU time used: 55.242669 s
Wall clock time passed: 55.246126 s
How to run tests
In addition, we also provide the unit testing application nbsimSystemSimulatorTest
for unit testing the Particle class and MassiveParticle class.
You can use it with the following command!
./bin/nbsimSystemSimulatorTest
Energy comparison based on solarSystemSimulator
Before the simulation, we knew the initial energy of the solar system as shown in the table below.
Kinetic Energy | Potential Energy | Total Energy |
---|---|---|
0.187358 | -0.356872 | -0.169514 |
In order to reflect the influence of the step size selection on the energy before and after the simulation of the motion of the solar system, we selected 10 different step sizes to simulate 100 years of time, and counted the kinetic energy, potential energy, and total energy of the solar system after the simulation, as shown in the following table Show.
Iteration step size (year) | Number of iterations | Kinetic Energy | Potential Energy | Total Energy |
---|---|---|---|---|
0.137 | 730 | 48.6749 | -0.0338147 | 48.6411 |
0.0548 | 1825 | 60.9605 | -0.0290884 | 60.9314 |
0.0274 | 3650 | 54.5068 | -0.030256 | 54.4766 |
0.0137 | 7300 | 47.8265 | -0.0347741 | 47.7917 |
0.00548 | 18250 | 38.5399 | -0.0408106 | 38.4991 |
0.00274 | 36500 | 30.0076 | -0.0542412 | 29.9534 |
0.00137 | 73000 | 21.0232 | -0.0646007 | 20.9586 |
0.000548 | 182500 | 11.2488 | -0.0900878 | 11.1587 |
0.000274 | 365000 | 6.36001 | -0.14031 | 6.2197 |
0.000137 | 730000 | 3.40302 | -0.207835 | 3.19518 |
As shown in the above table, with the gradual reduction of the iteration step size, the energy of the system gradually converges to the initial energy before the simulation. This means that the selection of the iterative step size controls the accuracy of the iterative simulation calculation. The smaller the step size, the higher the accuracy of the simulation.
Benchmark results based on solarSystemSimulator
Similarly, we picked 10 different sets of step sizes for benchmarking the simulation run times. The statistical results are shown in the table below.
Iteration step size (year) | Number of iterations | CPU Time(s) | Wall Clock Time(s) |
---|---|---|---|
0.137 | 730 | 0.846748 | 0.857644 |
0.0548 | 1825 | 1.787472 | 1.787477 |
0.0274 | 3650 | 3.652815 | 3.652824 |
0.0137 | 7300 | 7.348401 | 7.348569 |
0.00548 | 18250 | 18.063838 | 18.064103 |
0.00274 | 36500 | 36.219869 | 36.243214 |
0.00137 | 73000 | 72.283587 | 72.286029 |
0.000548 | 182500 | 181.095563 | 181.102941 |
0.000274 | 365000 | 359.914779 | 359.925051 |
0.000137 | 730000 | 723.421311 | 723.448250 |
As shown in the table above, as the iteration step size is gradually reduced, the CPU time and Wall Clock Time spent are higher. This means that the smaller the step size, the longer the computation time required for the simulation.
Based on the above considerations, we choose a time step value of 0.000274
that provides a good balance between simulation runtime and accuracy.
Benchmark results based on openMpSystemSimulator
Next, we used OpenMp for parallelized simulation optimization, and counted the benchmark results before and after optimization. Among them, we selected several groups of different iteration times and iteration steps, and recorded the CPU time and Wall Clock Time under different threads of the simulation calculation of 2000
random particle clusters based on this.
Below are the results of the CPU time.
iteration step size (year) | number of iterations | not parallelized | number of threads = 1 | number of threads = 2 | number of threads = 4 |
---|---|---|---|---|---|
0.0548 | 1825 | 27.413210 | 27.411340 | 31.352563 | 42.216389 |
0.0274 | 3650 | 55.034101 | 55.074900 | 62.164351 | 77.438851 |
0.0137 | 7300 | 108.30875 | 108.697718 | 124.125319 | 167.267532 |
0.00548 | 18250 | 282.783029 | 282.784735 | 312.131313 | 400.629887 |
0.00274 | 36500 | 551.715021 | 551.713688 | 623.113399 | 782.342311 |
Below are the results for Wall Clock Time.
iteration step size (year) | number of iterations | not parallelized | number of threads = 1 | number of threads = 2 | number of threads = 4 |
---|---|---|---|---|---|
0.0548 | 1825 | 27.43822 | 27.411522 | 15.680104 | 10.560377 |
0.0274 | 3650 | 55.0319401 | 55.077507 | 31.085852 | 19.364649 |
0.0137 | 7300 | 108.70310 | 108.701400 | 62.065410 | 41.832294 |
0.00548 | 18250 | 282.1484 | 282.799602 | 156.071492 | 100.176392 |
0.00274 | 36500 | 551.387408 | 551.730181 | 311.568369 | 204.24124 |
It is not difficult to see that the two usages show opposite results. When not parallelized and when the number of threads is 1, the two times are basically the same. When parallelization and multi-threading are enabled, the CPU time increases as the number of threads increases, while the Wall Clock Time decreases as the number of threads increases.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.