Course Outline
Foundations of GPU-Accelerated Computing
- Concepts of heterogeneous computing and CPU-GPU architectural differences.
- Understanding CUDA execution models and memory spaces.
- Compiling CUDA C++ code using nvcc and CMake.
- Validating the GPU development environment setup.
Parallel Algorithms with Thrust and CUB
- Implementing GPU-accelerated sorting, reduction, and transformation operations.
- Adapting STL algorithms for efficient GPU execution.
- Utilizing Thrust device vectors and execution policies.
- Applying CUB device-wide primitives for custom processing pipelines.
GPU Memory Architecture and Management
- Differentiating global, constant, and texture memory types.
- Managing explicit device memory allocation and data transfers.
- Using Unified Memory to streamline data access.
- Optimizing memory coalescing and access patterns.
Asynchronous Execution via CUDA Streams
- Establishing and managing CUDA stream workflows.
- Overlapping kernel execution with data transfer operations.
- Employing CUDA events for managing dependencies.
- Tuning stream priorities and concurrency.
Developing Custom CUDA Kernels
- The SIMT programming model and the concept of warp execution.
- Configuring kernel launches and implementing grid-stride loops.
- Managing thread indexing and multidimensional grids.
- Implementing robust error handling and CUDA runtime API validation.
Thread Hierarchy and Execution Model
- Structuring grids, blocks, and threads within 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
- Working with the cooperative_groups API and various group types.
- Implementing thread-block tiles and tiled_partition.
- Executing grid-level cooperative launches.
- Managing multi-grid synchronization patterns.
Shared Memory Optimization Techniques
- Understanding shared memory banks and avoiding bank conflicts.
- Applying tiling strategies for matrix operations.
- Using shared memory as a user-managed cache.
- Utilizing cuda::shared_memory_mdspan for multidimensional data views.
Kernel Fusion and Advanced Parallel Patterns
- Merging multiple kernels to minimize launch overhead.
- Implementing scan, reduce-by-key, and segmented algorithms.
- Using atomic operations and lock-free data structures.
- Leveraging warp-aggregated atomics to improve throughput.
Profiling and Optimization with Nsight Systems
- Conducting timeline analysis of CPU and GPU activities.
- Identifying and resolving memory transfer bottlenecks.
- Profiling kernel performance and occupancy levels.
- Performing iterative optimization using Nsight Compute.
Modern C++ Features in CUDA Device Code
- Incorporating lambdas, constexpr, and auto within kernels.
- Using 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
- Defining and launching CUDA graph structures.
- Capturing graphs from stream execution flows.
- Implementing graph updates and conditional execution nodes.
- Minimizing launch latency for iterative workloads.
Integration Patterns for Existing Applications
- Encapsulating GPU code behind standard C++ interfaces.
- Managing multi-GPU and NUMA system architectures.
- Integrating build systems with CMake and CUDA.
- Debugging device code using cuda-gdb.
Summary and Best Practices
- Evaluating when to use Thrust, CUB, or custom kernels.
- Achieving performance portability across different GPU architectures.
- Organizing code and applying RAII principles for CUDA resources.
- Exploring next steps and advanced pathways in CUDA development.
Requirements
- Proficiency in core C++ concepts, including lambda expressions, templates, and the Standard Template Library (STL).
- Working knowledge of standard algorithms, containers, and iterator mechanics.
- Confidence in utilizing loops, conditional structures, and function definitions.
- No previous experience with CUDA or GPU programming is necessary.
Target Audience
- C++ developers looking to boost the performance of compute-intensive applications using GPUs.
- Software engineers moving from CPU-only environments to heterogeneous parallel programming.
- Performance engineers and quantitative developers handling large-scale datasets.
Testimonials (3)
Initially, the trainer's pace seemed a bit too fast for me, but after offering the feedback during the training, he acknowledged it and slowed down the pace without sacrificing any of the lectures. Good rapport with the audience, very friendly and open for discussions.
Alexandru Ostafi - Siemens
Course - Advanced C++ : Practical workshop
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.