Hardware-Software Interactions: Concurrency & Computing

Learn how to write high-performance programs that wring every last bit of performance from your hardware.

Welcome to this course. Starting with the traditional approach to concurrency, you will learn how to write multithreaded concurrent programs and compose ways that won’t require locking. Until recently, programs got faster by themselves as CPUs were upgraded, but that doesn’t happen anymore.  The clock frequency of new processors has almost peaked, and while new architectures provide small improvements to existing programs, this only helps slightly. To write efficient software, you now have to know how to program by making good use of the available computing resources, and this course will teach you how to do that. In this course, you will explore the concepts of parallelism granularity, and fine-grained and coarse-grained parallel tasks by choosing a concurrent program structure and parallelizing the workload optimally. You will also learn how to use task parallel library, cancellations, timeouts, and how to handle errors. You will know how to choose the appropriate data structure for a specific parallel algorithm to achieve scalability and performance. Further, you’ll learn about server scalability, asynchronous I/O, and thread pools, and write responsive traditional applications. This course covers all the major aspects of writing efficient programs, such as using CPU resources and memory efficiently, avoiding unnecessary computations, measuring performance, and how to put concurrency and multithreading to good use. You’ll also learn about compiler optimizations and how to use the programming language more efficiently. Finally, you’ll understand how design decisions impact performance.

What you’ll learn

  • Learn How to Write Efficient Programs.
  • Learn how to write high-performance programs that wring every last bit of performance from your hardware.
  • Learn and understand concurrency.
  • Learn how to get the most out of your CPUs, caches, and memory.
  • Learn how to measure performance.

Course Content

  • Welcome –> 2 lectures • 12min.
  • Getting Started –> 6 lectures • 46min.
  • Learn How to Measure Time In Programs –> 3 lectures • 32min.
  • Understanding Threads –> 4 lectures • 34min.
  • Learn How Threads Interact With Memory –> 3 lectures • 37min.
  • Synchronization – Learn About Memory Accesses –> 6 lectures • 1hr 3min.
  • Understanding Memory Models –> 4 lectures • 31min.
  • Understanding Memory Barriers –> 5 lectures • 55min.
  • Understanding Lock-Based & Lock-Free Programming –> 6 lectures • 1hr 9min.
  • Understanding Lock-Free Data Structures –> 19 lectures • 3hr 19min.

Hardware-Software Interactions: Concurrency & Computing

Requirements

Welcome to this course. Starting with the traditional approach to concurrency, you will learn how to write multithreaded concurrent programs and compose ways that won’t require locking. Until recently, programs got faster by themselves as CPUs were upgraded, but that doesn’t happen anymore.  The clock frequency of new processors has almost peaked, and while new architectures provide small improvements to existing programs, this only helps slightly. To write efficient software, you now have to know how to program by making good use of the available computing resources, and this course will teach you how to do that. In this course, you will explore the concepts of parallelism granularity, and fine-grained and coarse-grained parallel tasks by choosing a concurrent program structure and parallelizing the workload optimally. You will also learn how to use task parallel library, cancellations, timeouts, and how to handle errors. You will know how to choose the appropriate data structure for a specific parallel algorithm to achieve scalability and performance. Further, you’ll learn about server scalability, asynchronous I/O, and thread pools, and write responsive traditional applications. This course covers all the major aspects of writing efficient programs, such as using CPU resources and memory efficiently, avoiding unnecessary computations, measuring performance, and how to put concurrency and multithreading to good use. You’ll also learn about compiler optimizations and how to use the programming language more efficiently. Finally, you’ll understand how design decisions impact performance.

At the end of the course, you will be able to diagnose and resolve typical problems that could happen in processors compilers and multithreaded applications.

Get Tutorial