Your 15-418/15-618 final project gives you the opportunity to dive deeply into a parallel systems problem of your choosing for the final month of the course. Perhaps more importantly to some of you, it is your big chance to achieve fame, glory, and prizes at the parallelism competition. What you attempt for your project is completely up to you. There are only two requirements:
(1) We want your project to be challenging (you should learn something relevant to the themes of this class) and (2) we want your project to be fun (you should be pumped to work on it)!

Choosing a Project

One common way to choose a project is to design a parallel solution to a problem in an application area that is interesting to you. Projects you have attempted in other classes are a good source of ideas. For example, projects in machine learning, AI, graphics, computational photography, and computer vision often stand to benefit greatly from parallelization. If you can convince the course staff that a parallel programming problem in one of these application domains is sufficiently challenging (that is, the solution to get good speedup is not obvious to you from the start), it's likely it will make a good project.

Other project ideas focus on system design or workload evaluation. For example, a project might compare the performance of CPU and GPU implementations of a parallel algorithm, and describe which platform is better suited for the job. Alternatively you could choose to evaluate different versions of an algorithm for different architectures. You could simulate the behavior of code on machines with different SIMD widths, add a feature to the ISPC compiler (its implementation is open source), or develop a parallel debugging tool that helps visualize bottlenecks and performance in parallel programs.

You may implement your project on any parallel platform. The machines in the GHC labs (4 and 6-core machines), GPUs, Blacklight, Amazon EC2, iPhone/iPad/Android SoCs (we can probably get you an NVIDIA Tegra K1 dev kit if you need one), FPGAs, Raspberry Pi, and architecture simulators are all possible and welcome platforms for projects. We also can give you access to a 32-core machine with 256 GB of RAM. You should come talk to us if you have exotic computing needs.

Below is a random sampling of ideas: (You should also look at the list of previous year's projects: Spring 2012 and Spring 2013)

Machine learning: scale up a recent learning algorithm/pipeline, for example - clustering, large scale classification, deep learning etc. (talk to Harry if you are interested!)

Machine learning: you may have heard of Google's famous 'cat detector'. This was a ML project designed at building features for tasks such as classification of images, using 16,000 CPU cores. More recently, Coates et al. 2013 showed that similar results can be obtained using commercial off-the-shelf GPU's. Specificially, they managed to get competitive results with google, whilest using just 3 machines. One problem with their result is that it required a lot of complex programming and hand-tuning of parameters. Instead, we will use machine learning to optimize the execution of machine learning algorithms on GPUs without requiring users to be familiar with the machine's hardware; you could say that we are 'fitting' the algorithm to the architecture. NOTE: If you would like to do this project please make sure you have the time to commit to it. You should also be able to write clean C++ code that can be read by others. Please contact Anders Oland (lead on this project) at anderso@cs and Harry.

Image processing (for those that have taken Efros' computational photography class)

For the really brave: Add polymorphic functions to ISPC: implement a function template mechanism in the compiler since it gets to be painful to write multiple versions of functions with both uniform and varying parameter types. (from Matt Pharr).

Add a GPU backend for a subset of GraphLab, or simply improve the existing parallel runtime for clusters or CPUs.

Extend your 411 compiler to generate parallel code.

Design a mini domain-specific language (or API, or framework) for a problem domain you are interested in.