The last four weeks of the semester will focus on synthesizing the concepts we’ve covered up to this point in the course. This will include some advanced topics for in-class discussion, but the course project will be the primary vehicle for you to demonstrate your understanding of the course material. You will propose, implement, and present a system that builds on topics from the course.

Project Components

Your final grade on the project will be based on three components:

10% Project Proposal
You will propose a project during week 11 of the semester. I will give some feedback on your proposal to help you arrive at a project that is manageable, and likely to earn a high grade.
30% Project Presentation
Project presentations will take place during the final exam time for this course. You will give a brief presentation of your project goals, give a demonstrating of your (hopefully) working project, and tell us how you built it.
60% Project Implementation
The project implementation is due at the end of the semester. Your implementation does not need to match your proposed project exactly—I know that issues come up during any project. Your implementation will be evaluated on the quality and clarity of code you write, as well as the technical content of the project; remember, this is an opportunity for you to show that you understand three of the key concepts from the course.

You can read about each of the projects components below.

Project Proposal

You will begin your work on the course project with a proposal. The purpose of this proposal is to demonstrate that you have thought about how your project will connect important ideas from the class, how you will complete your work on the project, and how you will evaluate your work. The proposal will take the form of a short written document, which you will have a week to prepare.

Choosing a Project

We’ve explored a wide variety of ideas and technical skills in this course, so there are many possible directions you could take your project. Regardless of the project you choose, you must clearly state a goal, and then combine at least three different concepts we’ve covered in this class in a meaningful way. Concepts from class include, but are not limited to:

  1. Processes
  2. Virtual Memory
  3. Memory Management
  4. Scheduling
  5. Parallelism with Threads
  6. Thread Synchronization
  7. Files and File Systems
  8. Parallelism with GPUs
  9. Networks and Distributed Systems

Your project does not need to make equal use of all three concepts, but should combine them in an interesting and unexpected way. As an example, writing a program that runs in a process, opens a file, and uses mmap to put it in your address space would not be a particularly interesting project and would likely not be approved. However, a project that uses virtual memory techniques to catch use-after-free errors and records them in a human-readable file format would be an interesting application of these concepts.

If you have a project idea that incorporates a concept that is not in the list above I may approve it. Similarly, if your project is sufficiently complex I may approve it even if you only draw on two of the concepts above. In either case, you will need to discuss this possible project with me before submitting your proposal.

Project Groups

You may work on your project individually, or in groups of up to three students. We will spend some time in class working to identify areas of common interest so you can make informed decisions about the group you work with.

Proposal Requirements

Your project proposal must answer the following questions:

What are you planning to build?
Describe the functionality that a user of this system would see.
What are the three concepts your project combines?
Briefly explain how each concept will be used in your proposed system.
How will you implement this project?
Describe the high-level approach, major components, and a rough timeline for the implementation.
What could go wrong with your implementation?
Try to anticipate challenges, and explain how you might work around them if your implementation doesn’t go exactly as planned. Technical challenges that might lead you to miss one of the key concepts are particularly important to identify early on.

Your proposal should be 2–3 pages of single-spaced text with a reasonable font.

Project Implementation

The largest component of this project is the actual implementation. Every group member must play a significant role in the implementation, but you are welcome to divide up implementation tasks. You are required to use C or CUDA for your project. If your project requires the use of another programming language in some limited capacity that may be acceptable, but make sure you talk with me about it first.

Your implementation will be evaluated using several criteria:

  1. Is the code clearly written and commented?
  2. Does the code check for errors whenever appropriate?
  3. Does the code compile without errors or warnings?
  4. Does the implementation incorporate the three planned key concepts?
  5. Does the implementation work?

The first three questions should be relatively easy to answer, but the fourth and fifth are more difficult. Four weeks is a very short time for a large implementation project, so I understand that you may run into issues and your plans could change. After reviewing your proposal, I will try to offer advice about parts of your project that will be challenging and encourage you to make backup plans if the implementation does not go smoothly.

If your final implementation is missing one of the key concepts you planned in your proposal you can still earn full credit on the project by submitting a short report in place of that part of the implementation. This short report should descrbe what you tried to implement, how it failed, and your best guess as to why that did not work. If you simply ran out of time before reaching an important concept you can describe your plans for the next steps in the project that would draw on this concept. This report is meant to show (in place of actual implementation) that you can connect a class concept with the rest of your project in a non-trivial way. Your report should make a convincing case that, if given sufficient additional time, you could actually complete the implementation including this third concept. You are free to use as much space for this report as you think is necessary, but I would guess that two pages of single-spaced text would be sufficient in most cases.

To show that your system works, you must provide a README file that precisely describes the basic use of your system, including both general instructions and a specific example that walks through an interaction with the system and the expected output. Your implementation must also include all necessary source and data files and a Makefile that allows me to build your project with the make command.

Project Presentation

Presentation times will depend on the number of project groups, so check back for more details. Regardless of the available time, presentations must answer the following questions:

What did you build?
Tell us, but also show us: give a live demo to the class if you can.
What concepts from the class did you use?
Give us a sense of what you combined to make the system work. If you missed an item you are still welcome to talk about it in your presentation as long as you make it clear what remains incomplete.
How does it work?
Tell us about the design of your system, as well as some interesting implementation details. Plan to identify at least one challenging part of the implementation and tell us how you completed it.

All group members must participate in the presentation, but it is up to you to decide how to divide the presentation topics.

Frequently-Asked Questions

Can we work in groups?
Yes, groups of up to three are permitted.
Can we work in groups across sections?
Unfortunately, no. We will use class time to work on these projects, and I want you to be able to work with your group.
Can we work individually?
Yes, although if too many students ask to work individually we may not have time for all presentations. In that case I may identify some students with similar interests and ask you to form a group. This has not happened in the past, but I want to be sure we allow sufficient time for engaging and informative presentations.
Can we use a programming langauge other than C or CUDA?
As a small part of your project? Yes. But the majority of your implementation should be in either C or CUDA.
Can we use other code (e.g. libraries) in our projects?
Yes, I actually encourage this. Using libraries is a great way to build interesting projects with less effort. Make sure that your implementation (the part you write) includes all three course concepts for your project; using a library that takes care of a concept for you does not count.