The course begins by providing a broad motivation for the design of multi- and many-core processors such as graphics processing units (GPUs). The first phase covers basic GPU concepts, including the evolution of GPU computing, a high-level overview of GPU architecture, and key differences from CPU architecture. Supplementary material is provided for students without a background in computer architecture fundamentals. Once a basic understanding is established, the module introduces the programming of GPUs using CUDA. The curriculum then delves into advanced concepts from both an architectural and programming perspective. To reinforce the theoretical knowledge gained in the lectures, students will engage in progressively more complex exercises throughout the module.