教你一步步写一个cuda path tracer:cuda简介和
cuda定义
cuda是nvidia推出的一种通用并行计算架构,该架构能够充分利用gpu强大的并行计算能力,解决一些具有内在并行性的计算密集型问题。
gpu vs cpu
通过上面的定义,我们可以知道cuda是和gpu紧密相关的。那么gpu相比于cpu到底有什么区别呢?优势又在什么地方?
从上面的结构图中我们可以很直观的看出,cpu的核心(core)数要远远小于gpu。其中,每一个core就是一个独立运行的运算单元。简单来说,GPU可以把一个程序分成数以万计的线程一起运行,而CPU支持的线程数量数量是非常有限的,而且往往是通过时间片轮转等算法实现的伪线程。这是两者的最大区别。
另外还有以下几个不同点:
1.cache数量和层级数:cpu > gpu;
2.寄存器数量:gpu > cpu;
3.延时(latency):gpu > cpu(和cache有关)
4.时钟周期:gpu > cpu
5.吞吐量:gpu > cpu
总而言之,cpu适合运行具有复杂逻辑跳转分支和中断的程序,gpu适合运行具有高并行性的计算密集型程序。cpu更通用,gpu更专用。
cuda计算模型
我们有时候会听到Core、SP(Streaming Processor)、SM(Streaming Multiprocessors)、Device这些名词,有时候也会听到Thread、Block、Grid这些貌似和前面有对应关系的术语,那么这些名词到底有什么关系呢?其实两者是可以一一对应的,只不过前者是硬件的说法,后者是软件的说法。具体见下图:
cuda的基本计算模型就是Thread——Block——Grid。
Thread:最基本的并行计算单元
Block:包含若干Thread
Grid:包含若干Block
可以把Grid想象成一个三维网格,Block就是三维网格的一个平面,Thread就是平面上的一根线条。
以上只是对cuda的简单介绍。后面遇到具体问题再具体讲解(例如cuda的内存模型,还有优化问题)。
cuda安装
目前cuda已经更新到了8.0版本,大家可以从官网上下载。注意操作系统、运行架构(x86/x64)和系统版本要选对。
建议在安装cuda之前,先安装好一个vs,推荐vs2015。据说cuda现在已经可以直接支持vs2017了,大家想尝鲜的话可以试试。我的搭配是vs2015+cuda。以后我都以vs2015为例进行说明。
安装过程其实很简单,一路下一步即可。cuda的默认安装目录位于C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0。
注:cuda安装之前会先检测显卡的兼容性。如果提示不兼容,请到官网上查询自己显卡所能支持的cuda版本,下载尽可能新的版本。我的显卡是GeForce GT 650M,可以支持cuda 8.0的基本要求,但这不代表可以完全直接所有cuda 8.0的新特性(cuda 8.0的Unified Memory特性我的显卡就不支持T_T)。
安装完毕,打开vs,点击文件-新建-项目,可以看到Nvidia的Cuda 8.0项目模板已经添加进去了。
输入项目名称,选择“CUDA 8.0 Runtime”项目模型,点击确定。vs会自动创建一个cuda项目。
查看项目属性,可以看到cuda的头文件、库文件以及nvcc编译器都已经自动设置好了。老版的cuda,这些东西都得自己设置的,现在的确方便了很多。
项目默认添加了一个kernel.cu文件,这段代码要做的就是把两个向量加起来。直接运行程序,如果不出意外,会看到如下结果:
ok,到这一步,cuda安装完毕。下面我们要开始正式的cuda学习了!