There are 2 kinds of final project: 1) based on a paper (some papers will be suggested in class). Read the paper understand the algorithm, implement it. Have a driver that has - a big stress test test that shows that you have no crashes, make tunable, so we can modify some parameters, frequencies of operations, etc - a smaller stress test that proves that you algorithm is correct, i.e. if you are implementing a BST, there is a way to check that the tree is in a valid state, etc - some time comparison. If you implemented BST, compare to single-threaded BST (std::set). Try to find a scenario when you can beat single-threaded. (play with frequencies of operations, size of data, etc). 2) based on your single-threaded implementation of whatever you want - may be something you did for another class. Try to multi-thread it to improve run-time, try a couple of approaches. Have a driver that - proves correctness, for example compares with the result of single-threaded implementation - make the number of threads variable (compile time or as a argument to main) play with the number of threads and size of input, similar to cs330 empirical analysis assignment (ask me where to get sample LaTeX file) draw graphs comparing run-time of single-threaded to multi-threaded with number of threads from 2 to 8. In both cases: you should submit a proposal for your project (email), we will discuss and may be remove or add some features to make it more reasonable. When ready to show, schedule an appointment with me, when we meet you prove correctness of implementation (using tests in your driver), be prepared to explain your results. If there is something that I do not like, you will have a chance to fix it and we will meet again.