This course provides an introduction to architectures, programming models, and optimization strategies for parallel and high performance computing systems. This course begins by defining what constitutes parallel computing and a high performance system. We will address the rudimental architectural characteristics of distributed and shared memory systems and their respective programing paradigms. We will discuss how to leverage HPC systems to solve large scale problems in a variety of applications such as image processing, deep learning, and molecular dynamics. The course will conclude with a discussion of evaluating deep neural networks on high-performance computing resources. Students will complete a number of assignments along with a project demonstrating particular applications on parallel processing systems.