Course Outline
Introduction to GPU-Accelerated Computing
- Heterogeneous computing concepts and CPU-GPU architectural design
- CUDA execution models and memory hierarchies
- Compiling CUDA C++ using nvcc and CMake
- Validating the GPU development environment
Parallel Algorithms via Thrust and CUB
- GPU-optimized sorting, reduction, and transformation operations
- Adapting STL algorithms for GPU execution
- Utilizing Thrust device vectors and execution policies
- Leveraging CUB device-wide primitives for bespoke pipelines
GPU Memory Architecture and Management
- Distinguishing global, constant, and texture memory types
- Explicit device memory allocation and data transfer
- Employing Unified Memory to simplify data access
- Optimizing memory coalescing and access patterns
Asynchronous Execution via CUDA Streams
- Creation and administration of CUDA streams
- Overlapping kernel execution with data transfer operations
- Managing dependencies using CUDA events
- Tuning stream priorities and concurrency levels
Developing Custom CUDA Kernels
- Understanding the SIMT programming model and warp execution
- Configuring kernel launches and implementing grid-stride loops
- Thread indexing strategies and multidimensional grids
- Error handling and verification via the CUDA runtime API
Thread Hierarchy and Execution Model
- Structuring grids, blocks, and threads in device code
- Utilizing warp-level primitives and ballot operations
- Implementing block-level synchronization and barriers
- Analyzing occupancy and resource utilization
Cooperative Groups for Flexible Parallelism
- Using the cooperative_groups API and group types
- Implementing thread-block tiles and tiled_partition
- Executing grid-level cooperative launches
- Patterns for multi-grid synchronization
Shared Memory Optimization Strategies
- Managing shared memory banks and avoiding bank conflicts
- Applying tiling strategies to matrix operations
- Using shared memory as a user-managed cache
- Employing cuda::shared_memory_mdspan for multidimensional views
Kernel Fusion and Advanced Parallel Patterns
- Fusing multiple kernels to minimize launch overhead
- Implementing scan, reduce-by-key, and segmented algorithms
- Utilizing atomic operations and lock-free data structures
- Enhancing throughput with warp-aggregated atomics
Profiling and Optimization via Nsight Systems
- Analyzing CPU and GPU activity through timeline views
- Detecting memory transfer bottlenecks
- Profiling kernel performance and occupancy
- Iterative optimization using Nsight Compute
Modern C++ Features in CUDA Device Code
- Using Lambdas, constexpr, and auto within kernels
- Implementing C++17 parallel algorithms and execution policies
- Applying C++20 concepts and ranges on the device
- Leveraging C++23 support in nvcc and CCCL 3.x
CUDA Graphs and Advanced Asynchrony
- Definition and execution of CUDA graphs
- Capturing graphs from stream execution
- Updating graphs and utilizing conditional execution nodes
- Reducing launch latency for iterative workloads
Integration Patterns for Existing Applications
- Encapsulating GPU code behind C++ interfaces
- Managing multi-GPU and NUMA system configurations
- Integrating build systems with CMake and CUDA
- Debugging device code using cuda-gdb
Summary and Best Practices
- Selecting among Thrust, CUB, or custom kernels
- Ensuring performance portability across GPU architectures
- Organizing code and applying RAII for CUDA resources
- Next steps and advanced CUDA learning pathways
Requirements
- Fundamental C++ proficiency, including lambda expressions, templates, and the Standard Template Library (STL)
- Working knowledge of standard algorithms, containers, and iterators
- Proficiency with loops, conditionals, and function structures
- No prior experience with CUDA or GPU programming is necessary
Target Audience
- C++ developers looking to speed up compute-intensive applications via GPUs
- Software engineers shifting from CPU-only to heterogeneous parallel programming
- Performance engineers and quantitative developers handling large-scale datasets
Testimonials (3)
Detailed explanation, re-iteration of points in a quite subtle way that really drove the knowledge home very well. Rod's willingness to double-check the odd obscure question that we rasied, to be sure that his answers were 100% right. Also, his interest in discussing the pros & cons of alternate coding styles so that we learnt not only how to use C++ in our intended way, but why it should be done that way.
Nick Dillon - cellxica Ltd
Course - Using C++ in Embedded Systems - Applying C++11/C++14
Experience sharing, it's teacher's know-how and valuable.
Carey Fan - Logitech
Course - C/C++ Secure Coding
The online-ness of it meant that we could save a lot of time. Much appreciated. Also, the fact that the trainer knew both c# and Cpp was a huge help since he could explain everything through knowledge we already possessed.