CUDA资料推荐及入门建议
CUDA(compute unified device architecture)是Nvidia(英伟达)公司的推出的一个显卡编程平台。它的特点是可以大规模的并行执行,在很多应用上比高频CPU性能高上一个或两个数量级。在早期就有了用于通用计算的显卡编程应用,叫GPGPU,但是编程模式比较麻烦,借助些第三方工具,不方便上手,所以NVIDIA瞧准这个通用并行计算的蛋糕推出了通用的计算平台CUDA,可以用C语言编程,极大的降低了显卡编程的难度。关于它的具体介绍我就不写了,这里推荐一个《深入浅出谈CUDA》(CUDA Zone可以下载到),介绍的不错。如果要具体点,全面点的介绍,可以参考清华大学的《大规模并行编程》的课件,同样在CSDN里可以下载到。还有一本书《GPU高性能运算之CUDA》,感觉小错误比较多,但是可以当当手册用,还是推荐看官方的program guid和best application的两个文档,一个介绍编程接口,一个讲优化。
下面说说我个人对CUDA入门的一点建议,首先不要有畏难情绪,其实显卡编程不是很难的,但要编好确实很难^_^,特别是如何设计并行算法和优化程序方面,需要多下功夫多练习。其次学习CUDA,要从编程模式和显卡硬件结构(更好的理解编程模式)出发,在一开始没接触CUDA的时候,自己老纠缠在到底能不能用C++在显卡编程中,其实这里有个误区,我们一直说的CUDA编程指的普遍是设备端编程或者说是显卡编程,在显卡上跑的程序是不支持C++的,就是KERNEL函数里不能用到C++特性,只支持扩展C。但是主机端(cpu端)的代码是完全支持C++的,NVCC在开始编译前会主动的剥离主机端代码和设备端代码,这样就能分开编译了,设备端可以编译成二进制的或PTX代码(类似与汇编),运行KERNEL函数时,CPU把这段代码拷贝到显存的某个位置上,通知GPU开始运行,GPU的线程管理和调度机制还是很灵活的。
CPU+GPU的编程模式,我觉得可以看成上位机与下位机的概念,其实GPU可以看成一般的单片机之类的。在CPU端需要交叉编译产生GPU端运行的代码,在程序执行时,由CPU把执行的代码传送到GPU上,这点与一般的上位机下位机概念不同,一般程序都是预先烧写在了微处理器上。但是这里不同,代码可以存储在显存中,这样指令的提取更快,而且编程更灵活。CPU端只控制数据的传输和内存的开辟,实际运行由GPU自己执行,GPU线程的调度的概念也很重要,在程序优化时会接触到,用多线程来掩盖程序执行的延迟。PS:GPU上的线程与CPU上的不同,一个是硬件切换,一个是软件调度。
另外,CUDA学习重在实践,看了一定的入门资料后,可以搭建CUDA的平台,装TOOLKIT,SDK,DRIVE,网上有教程,先看官方的例子,再自己写。还有一个小问题,SDK里的函数库是针对例程的,不属于CUDA,在编写自己的CUDA程序时,要搞清楚CUDA的架构。不要搞混淆。推荐使用勇哥第三方工具,可以方便开发。最后,我也是一个初学者,说的不对大家见谅,共同探讨,共同进步。