Introduction to Parallelism
Locks and Atomics
Learn how mutexes and atomics prevent race conditions, and why hardware contention can make multithreaded code slower than single-threaded code.
Introduction to Parallelism
Cache Coherency and False Sharing
Explore the performance cost of synchronization, how to mitigate it, and how to avoid it entirely with better algorithm design.
Introduction to Parallelism
SIMD and Automatic Vectorization
Learn how SIMD registers allow you to process multiple data points in a single instruction, unlocking the full power of each CPU core.
Managing C++ Projects Using CMake
CMake Conditionals and Loops
Transform your static build descriptions into dynamic scripts with CMake's control flow commands, if() and foreach().
Managing C++ Projects Using CMake
Automated Testing and CTest
Learn the fundamentals of automated testing in C++ with CTest. Create your first test suite, register tests with add_test(), and run them with the ctest command.
Using Algorithms and Views
The Four Algorithm Families
The Producer-Consumer model of C++20 Ranges and the hardware implications of eager vs lazy evaluation.
Using Algorithms and Views
Sorting and Materialization
Integrate sorting into C++20 pipelines, the difference between stable and unstable sorts, and how to use partial sorting.
Using Algorithms and Views
Comparators and Projections
Learn how C++20 Projections allow us to separate sorting logic from data layout, the mechanics of std::invoke and the hardware reality of sorting large objects.
Using Algorithms and Views
Proxy Sort and Structure of Arrays
Learn why sorting large objects is slow, and how to optimize it using Proxy Sorting and Data-Oriented Design (SoA).
Using Algorithms and Views
Composition, Zipping, and Indicies
Iterate multiple containers simultaneously with zip, handle indices with enumerate, and skip elements with drop and stride.