As computing systems increasingly rely on parallelism, understanding how to design efficient parallel algorithms has become essential. This graduate-level theory course introduces the fundamental principles of, and the algorithm design techniques for exploiting, parallelism in computation. The focus will be on algorithmic tools and techniques, in the context of rigorous models of parallel computation.