CUDA(Computer Unified Device Architecture):计算机统一设备架构
NVIDIA在2007年推向市场的并行计算架构
严格来说,CUDA不知是一种编程语言,它包括了NVIDIA对于GPGPU的完整的解决方案:从支持通用计算并行架构的图形处理器,到实现计算所需要的硬件驱动程序、编程接口、程序库、编译器、调试器等。
基于C的高级语言:C for CUDA。 CUDA C含有NVIDIA扩展和限制的类C语言,它支持大多数C语言的指令和语法,并加入了一定的使程序能再GPU上进行多线程计算的语言扩展
nvcc编译器是NVIDIA以PathScale的Open64 C编译器为基础开发的。编译、链接后的机器代码可以直接运行在NVIDIA指定的GPU上。
CUDA与经典GPGPU方法相比,显著的区别在于它能人实现人意的聚集(gather)和散布(scatter)
聚集和散布如下所示:
float a[100];
float b=0.0f;
b=a[33]; //聚集
a[66]=b; //散布
基于图形API的经典GPGPU技术把重点放在输入数据的组织和片段着色器的设计上,用户对执行计算的现成并没有多大控制。
用户只能选择输入数据的数量,而对于处理器中分配的线程总数不能干预。
用户设置数据的数量。
CUDA用一种分层的编程模型来组织线程。
用户不仅可以定制现成的数目,更可以将他们编制为合适的线程组。通过线程组的方式,CUDA巧妙地将同样的程序是英语不同的硬件规格上。
用户决定线程的数量。
SIMD:单指令多数据,每个数据该怎样被处理(经典GGPU)
SIMT:单指令多线程,每个线程该怎样被处理(CUDA)
多处理器:与一个线程组相关联的硬件实现——一套完整的计算资源的最小实现
单处理器(CUDA核):一个流多处理器包含若干个标量处理器——具体计算指令的执行单位
正确的观念:找出程序中适合在GPU上计算的部分和适合在CPU上计算的部分,然后确定一种优化方案,让两种处理器协作完成任务。
瓶颈:设备和主机之间的数据传输。在某些情况下,机试CPU和GPU可以实现并发,但两者之间的数据传输还是消耗了可观的时间。
参考文献:
仇德元.《GPGPU编程技术——从GLSL、CDPU到OpenGL》[M].河北省三河市:机械工业出版社,2012年:323.