The goal of this course is to build a strong understanding of the fundamentals of the architecture of parallel computers and efficient programming for them. We will examine how architectures are designed to exploit and extract different types of parallelism. The focus will be on fundamentals, trade-offs in parallel architecture design, and cutting-edge research. Architectures studied may include parallel microprocessors, GPUs, and FPGAs.