Try running a large sized board for a large number of iterations. For example:
1024 1024 500 3 9 8 9 9 9 10My program (compiled with -g -Wall), took about 16.5 seconds to run on the CS lab machine named basil:
./gol challenge_1024.txt 0 Total time: 16.509 seconds After 500 rounds on 1024x1024, number of live cells is 3Note: always run timing experiments with command line option 0 that does not include the animation part (i.e. there is no clear, printing the board, nor usleep between iterations). This experiment was run on 11/10/19.
If you program is much slower, then try to improve your program's performance to see if you can get closer to mine, or beat it. However, try to improve your solution in a different copy of its source (in faster.c), so that you do not accidentally break your correct and working solution in gol.c.
cp gol.c faster.cThen copy over a new version of the Makefile, and some test input files (enter y to the question about replacuing Makefile):
cp ~newhall/public/cs31/golchallenge/* .
When you change your code you need to ensure that it still solves the correct problem. Verify that your changes still correctly implement gol by running the faster.c version on a small example in the ascii or ParaVis run modes to ensure this.
To ensure that you are running experiments without interference from other processes using up a lot of CPU and/or RAM, you can see what else is going on using these commands:
The who command will list who else is logged into a machine. The top command will show cpu and memory usage of processes running on a machine. Here is a lot more information about tools for examining system state.
Using basil: To keep basil free as much as possible for other groups trying to do final timing to beat me, please first run timed runs on another machine and see how close you are getting.
You can, and should, do almost all your timing on any machine, just to see if you beat mine, you should run yours on the same machine as I ran my tests (not all CS lab machines are equally powerful).
You can find the specs of different CS lab machines off the CS department lab help page, here: lab machine specsbash for loop: At the bash shell prompt (bash is the name of the Unix shell program) you can write a bash loop to tell bash to repeat an action some number of times. The syntax is almost like a C for loop except do and done are in place of { and }, and you need double parens. Here is an example for loop to run gol on the same input 5 times (hit the enter key after each line, the "$" is the bash prompt):
$ for ((i=0; i< 5; i++)) > do > time ./faster challenge_1000.txt 0 > donetime command: The above example bash loop, uses the time command to run ./faster. time times the entire execution of faster (in addition to the output from my program using gettimeofday timers in my code that do not include board initialization time):
time ./gol challenge_1000.txt 0 Total time: 15.773 seconds After 500 rounds on 1000x1000, number of live cells is 3 real 0m15.794s user 0m15.773s sys 0m0.016s
For example, here is my time running on basil for for my optimized gol program (this is the exact same C code as the results above, the only difference is compiling with -03):
./faster challenge_1000.txt 0 Total time: 2.285 seconds After 500 rounds on 1000x1000, number of live cells is 3The Makefile you copied over builds faster with -O3 already. If you need to debug it your faster program, in the Makefile change the definition of FASTCFLAGS to the one commentted out (with -g -Wall).
# these are timed runs compiled with gcc flags -g -Wall # gcc -g -Wall -o gol gol.c # total time for 500 iterations of 500x500 is ~4 secs total time for 500 iterations of 1000x1000 is ~18.5 secs total time for 500 iterations of 2000x2000 is ~73 secs total time for 500 iterations of 4000x4000 is ~293.5 secsIn these experiements the number of iterations is the same for different size boards. These show how the runtime grows with the problem size: this shows linear increase in time with increase in problem size (each 4 times increase in the problem size results in about a 4 times increase in execution time). If you think about the complexity of GOL, this is what you would expect--it is an 0(n) algorithm (where n is the number of grid cells) for a fixed number of iterations. The timings were for these command lines (each run 5 times):
time ./gol challenge_500.txt 0 time ./gol challenge_1000.txt 0 time ./gol challenge_2000.txt 0 time ./gol challenge_4000.txt 0
# these are timed runs of my program compiled with the gcc flag -O3 # gcc -O3 -o gol gol.c # total time for 500 iterations of 500x500 is ~0.6 secs total time for 500 iterations of 1000x1000 is ~3 secs total time for 500 iterations of 2000x2000 is ~12 secs total time for 500 iterations of 4000x4000 is ~48 secsJust compiling the code with -03 compiler optimization flag, results in code that is roughly 7 times faster than the version that is compiled with -g.
The timings were for these command lines (each run 5 times):
time ./faster challenge_500.txt 0 time ./faster challenge_1000.txt 0 time ./faster challenge_2000.txt 0 time ./faster challenge_4000.txt 0
In general, you want to do development with the -g flag so that you can easily debug your program. The -g flag and the -O flags are not compatible, and -g wins. If you are running experiments on code you have already debugged and tested, then you may want to enable compiler optimization to improve its runtime.
And your fast solution should be correct regardless of the input file on which it is run...try out timing it on other files too.
git add faster.c Makefile ChallengeNotes git commit -m "faster program is faster" git push
To compare your faster.c to your gol.c solution, you do not need to run on basil, just run both on the same machine. If your solution is significantly faster than mine, then make sure to tell me that in your ChallengeNotes file (and let me know in person or via email too).