This course covers hardware architectures and software techniques for distributed, parallel and high performance computing systems. The content includes thread programming on shared-memory systems and parallel programming on distributed-memory systems, parallel algorithms and programming to solve complex and large scale problems.