研究生阶段开始接触CUDA。这里要感谢我的老板,感谢他的眼光和对我的信任,把这副担子交给我,我不想让他失望。在学习中慢慢陶醉于CUDA的神奇,被它强大的power所折服,这个过程实在太美妙,让我有很强烈的冲动把它记下来。这期间也受到一些前辈们博客的启发,我会在以下内容中特别提到。在项目实践中还有一些值得记下来的经验教训和典型bug,将另外专开一篇帖子记录。OK, let's begin.
(一)、CUDA相关书籍:《GPU高性能编程CUDA实战》、《CUDA并行程序设计GPU编程指南》、《GPU高性能运算之CUDA》、《大规模并行处理器编程实战》、《OpenGL编程指南》、《GPGPU编程技术——从GLSL、CUDA到OpenCL》
(二)、程序体系:CUDA解构、线程模型、内存模型、
(三)、CUDA解构
一、代码结构:
1、主机端代码框架:(1)启动CUDA,使用多卡时加上设备号,或使用cudaSetDevice()设置GPU设备;(2)为输入数据分配内存空间;(3)初始化输入数据;(4)为GPU分配显存,用于存放输入数据;(5)将内存中的数据拷贝到显存;(6)在GPU上分配显存,用于存放输出数据;(7)调用device端的kernel进行计算,将结果写到显存中对应区域;(8)为CPU分配内存,用于存放GPU传回来的输出数据;(9)将显存中的结果读回到内存;(10)使用CPU对数据进行其他处理;(11)释放内存和显存空间;(12)退出CUDA。
2、设备端代码框架:(1)存显存读数据刀GPU内;(2)对数据进行处理;(3)将处理后的数据写回显存。
3、CUDA runtime API & CUDA driver API 的用途、关系:必须用二者之一,才能实现管理GPU资源,在GPU上分配显存、启动核函数等功能。但是在一个程序中只能用二者中的一种,不能混合使用。
二、CUDA对C的扩展:(1)函数类型限定符。__global__、__device__等。(2)变量类型限定符。__shared__等。(3)内置矢量类型。dim3等。(4)引入了4个内建变量。blockIdx、threadIdx、gridDim、blockDim。(5)引入了<<<>>>运算符,用于指定grid和block维度。ÿ