CUDA学习笔记
参考资料:CUDA C Programming Guide
第一章 简介
1.1 从图像处理到通用并行计算
GPU计算特点:
高度并行的,多线程的,多核处理器,高存储带宽
GPU和CPU浮点数计算能力的差异:
GPU擅长计算密集型,高度并行的计算,特别是图像渲染,因为它将更多的晶体管用来做计算而不是数据缓存和流控制;
GPU特别适合解决数据并行计算的问题,也就是单指令多数据的运算,GPU有很高的算术运算/内存操作比;
由于同一代码对多个数据操作,所以GPU不需要很多流控制。由于对很多数据同时操作,所以内存访问延迟可能会在大量的计算面前淹没,而不是在大量的数据缓存中。
数据并行处理将元素映射到并行处理的线程中。很多需要处理大量数据集的应用可以使用数据并行计算模型来加速计算。几个应用例子:
3D渲染 像素和顶点 并行线程
图像和媒体处理 图像块和像素 并行线程
(如渲染图像的后期处理,视频编解码,图像缩放,立体视觉和模式识别)
其他算法,如信号处理,物理仿真,计算生物学,计算金融学
1.2 CUDA: a General-Purpose Parallel Computing Architecture
最初版本由NVIDIA公司在2006年发布,它具有全新的并行计算模型和指令集架构,充分利用NVIDIA公司的GPU来解决很多复杂的计算问题。
CUDA支持C语言,Fortran语言,OpenCL 应用程序接口,DirectCompute应用程序接口。
1.3 可伸缩的编程模型
multicore CPU和 manycore GPU的出现意味着现在的主流处理器信芯片是并行的系统。他们的并行性能增长满足摩尔定律。CUDA立志于让熟悉C语言的程序员快速地掌握对GPU的编程。
CUDA的三个核心概念:
a hierarchy of thread groups
shared memories
barrier synchronization
这些概念提供了fine-grained数据并行和线程并行,嵌套在coarse-grained数据并行和任务并行中。
它们引导程序员把问题分解子问题:
coarse子问题:可以由多个独立的线程块并行执行计算
fine 子问题:可以由多个独立的同一线程块中的线程协作完成
每个block可以由任何processor core以任何顺序调度,同时的或者序列的,所以一个CUDA程序可以执行在任何数量的processor cores中,这就是所谓的可伸缩性。

上图表示一个多线程的程序在具有不同数量cores的GPU上执行时的结果,具有较多核心的GPU要比较少cores的GPU花费较少的时间完成同样的工作。
1.4 本书结构
第一章:CUDA的一般介绍
第二章:CUDA编程模型概述
第三章:编程模型接口
第四章:硬件实现
第五章:实现CUDA最优性能的一些建议
附录A: CUDA支持的硬件列表
附录B: C语言扩展的完全描述
附录C: CUDA支持的数学函数列表
附录D: 列出了设备代码支持的C++ construct
附录E: nvcc的 关键字和指令
附录F: 纹理访问的更详细描述
附录G: 设备的技术规格和架构细节