[Note: this is quite a difficult project. To take the project, you should already have experience with OpenMP, or have an interest in parallel computing, or just be a very good programmer.]
OpenMP is a small domain-specific language for describing parallelism in C, C++ and Fortran programs. OpenMP was originally designed to express parallelism using multiple threads. But in the last 20 years the language has expanded to vector SIMD parallelism and accelerator hardware such as GPUs. OpenMP allows the programmer to express simple patterns of parallelism with just a line or two of directives. In particular OpenMP makes it very easy to specify that all iterations of a for loop can be executed in parallel across a set of worker threads.
The goal of this project is to create a new, experimental OpenMP directive that is aimed at expressing parallelism of for loops for superscalar processors. A superscalar processor can execute multiple instructions from the same thread in parallel. Superscalar processors usually have an execution window of dozens to hundreds of instructions that are expected to execute soon. Superscalar processors can pick independent instructions from this window to execute in parallel. Thus, if two instructions can execute in parallel, and they are in the execution window at the same time, then the processor might execute them at the same time. In contrast, if the execution distance between two independent instructions is larger than the execution window size, then they cannot execute in parallel.
The goal of this project is to create a small prototype tool that allows the programmer to express superscalar style parallelism in for loops. The new OpenMP directive will allow the programmer to specify that the iterations of the for loop can be executed in parallel, and the new tool will create source code for a corresponding for loop that mixes together the code from different iterations. The process of creating this code is simple if the for loop does not contain control flow, but it becomes much more complicated where the loop contains if and while statements.
It is possible to concentrate on different aspects of the tool. For example, you might focus first on generating the transformed C/C++ code, and only latter worry about creating a parser for OpenMP. The tool could alternatively be implemented in an existing implementation of OpenMP, such as IMOP, Rex (​https://github.com/ouankou), or Clang, although the student should be cautious about the challenges of working with a large existing code base.