1 Introduction Part I Fundamental Concepts 2 Heterogeneous data parallel computing 3 Multidimensional grids and data 4 Compute architecture and scheduling 5 Memory architecture and data locality 6 Performance considerations Part II Parallel Patterns 7 Convolution: An introduction to constant memory and caching 8 Stencil 9 Parallel histogram 10 Reduction And minimizing divergence 11 Prefix sum (scan) 12 Merge: An introduction to dynamic input data identification Part III Advanced patterns and applications 13 Sorting 14 Sparse matrix computation 15 Graph traversal 16 Deep learning 17 Iterative magnetic resonance imaging reconstruction 18 Electrostatic potential map 19 Parallel programming and computational thinking Part IV Advanced Practices 20 Programming a heterogeneous computing cluster: An introduction to CUDA streams 21 CUDA dynamic parallelism 22 Advanced practices and future evolution 23 Conclusion and outlook Appendix A: Numerical considerations