CPUs, GPUs, and in-between

Course development by:

Social media:

Videos:

Course materials:

Reading list:

Contact:

My teaching philosophy:

As an educator, my primary goal is to inspire my students to learn and grow while providing them with the tools and knowledge necessary to succeed in their careers. In my teaching, I strive to create an engaging, challenging, and supportive environment where students can feel confident and motivated to explore new concepts and ideas.

In this course, I aim to provide students with a solid foundation in parallel programming principles and equip them with the skills and knowledge required to develop high-performance, scalable applications on modern multi-core and many-core processors. Through a combination of lectures, graded programming exercises, and competitive projects, students will learn to handle data parallelism with vector instructions, task parallelism in shared memory with threads, vector programming, and SIMD extensions, efficiently offloading kernels to accelerators, as well as more advanced topics such as thread affinity, memory models, and NUMA. We will use the oneAPI standard and other heterogeneous APIs to ensure that our code is portable and future-proof.

At the heart of this course is the recognition that the field of high-performance computing is undergoing a profound transformation, driven by the end of Dennard scaling and the rise of multi-core and many-core architectures. As we move away from the era of Moore’s law, it is more important than ever to understand the fundamental principles of parallelism and to be able to write code that can take advantage of the available hardware. With Exascale supercomputers already online, we are entering a new era of scientific and technological breakthroughs. The students who take this course will be well-positioned to contribute to these advances.

To ensure that all students have a strong foundation in the prerequisite knowledge, I will require previous knowledge in C/C++ or Fortran, programming in the Linux environment, and Linux shell proficiency in the early weeks of the course. By building upon this foundation, I will guide students to acquire the skills necessary to handle the various forms of parallelism in shared memory programming.

Throughout the course, I will maintain an interactive and supportive classroom environment that encourages students to ask questions, engage in discussion, and collaborate with their peers. I believe this approach fosters a deeper understanding of the material, encourages students to take ownership of their learning, and helps prepare them for the challenges they will face in their future careers.

In addition to the course syllabus, I will provide students with various resources to aid their learning. This will include supplementary reading materials, programming examples, and hands-on exercises, updated and revised throughout the semester to ensure students receive the most up-to-date and relevant information. However, I believe that the most important resource in any classroom is the students themselves. 

Ultimately, my goal is to provide students with the skills and knowledge they need to succeed in their future careers, whether in HPC, data center workloads, artificial intelligence, or any other field that requires expertise in shared-memory parallelism. Through my teaching, I aim to inspire my students to become lifelong learners capable of adapting to new challenges and opportunities in their field.

Skip to content