CUDA编程指南详细的介绍了如何在CUDA编程实现最大限度的利用N显卡资源来实现加速的功能。
该作品是PDF文件格式请下载 福昕PDF阅读器
CUDA优点
在GPUs(GPGPU)上使用图形APIs进行传统通用计算,CUDA技术有下列几个优点:
分散读取——代码可以从存储器的任意地址读取
统一虚拟内存(CUDA 6)
共用存储器——CUDA公开一个快速的共用存储区域(每个处理器48K),使之在多个进程之间共用。其作为一个用户管理的高速缓存,比使用纹理查找可以得到更大的有效带宽。
与GPU之间更快的下载与回读
全面支持整型与位操作,包括整型纹理查找
限制:
CUDA不支持完整的C语言标准。它在C++编译器上运行主机代码时,会使一些在C中合法(但在C++中不合法)的代码无法编译。
不支持纹理渲染(CUDA 3.2及以后版本通过在CUDA数组中引入“表面写操作”——底层的不透明数据结构——来进行处理)
受系统主线的带宽和延迟的影响,主机与设备存储器之间数据复制可能会导致性能下降(通过过GPU的DMA引擎处理,异步存储器传输可在一定范围内缓解此现象)
当线程总数为数千时,线程应按至少32个一组来运行才能获得最佳效果。如果每组中的32个进程使用相同的运行路径,则程序分支不会显著影响效果;在处理本质上不同的任务时,SIMD运行模型将成为一个瓶颈(如在光线追踪算法中遍历一个空间分区的数据结构)
与OpenCL不同,只有Nvidia的GPUs支持CUDA技术
由于编译器需要使用优化技术来利用有限的资源,即使合法的C/C++有时候也会被标记并中止编译
CUDA(计算能力1.x)使用一个不包含递归、函数指针的C语言子集,外加一些简单的扩展。而单个进程必须运行在多个不相交的存储器空间上,这与其它C语言运行环境不同。
CUDA(计算能力2.x)允许C++类功能的子集,如成员函数可以不是虚拟的(这个限制将在以后的某个版本中卸载)[参见《CUDA C程序设计指南3.1》-附录D.6]
双精度浮点(CUDA计算能力1.3及以上)与IEEE754标准有所差异:倒数、除法、平方根仅支持舍入到最近的偶数。单精确度中不支持反常值(denormal)及sNaN(signaling NaN);只支持两种IEEE舍入模式(舍位与舍入到最近的偶数),这些在每条指令的基础上指定,而非控制字码;除法/平方根的精度比单精确度略低