Cuda

cuda

CUDA编程

除了官方提供的CUDA C Programming Guide之外

个人认为很适合初学者的一本书是CUDA by Example 中文名: GPU高性能编程CUDA实战 阅读前4章就可以写简单的应用了

下面两个链接是前四章的免费Sample 以及相关的source code的下载站点 http://developer.download.nvidia.com/books/cuda-by-example/cuda-by-example-sample.pdf CUDA by Example: An Introduction to General-Purpose GPU Programming 另外 Dr. Dobb’s的CUDA, Supercomputing for the Masses系列文章也可以帮你快速入门CUDA: CUDA, Supercomputing for the Masses: Part 1 我不推荐的是 读它不如直接读文档

浏览GPU Computing SDK中与图像处理相关的项目 基本涵盖了基础的图像处理算法如各类filter histogram DCT 高斯模糊 降噪等等 你可以通过阅读这些项目学会如何利用CUDA操作图片像素以及一些基本的GPU下的图像IO操作

如果你需要的图像处理算法没有被GPU Computing SDK覆盖 你可以尝试CUDA NPP库 这是附带在CUDA Toolkit里可以直接使用的 NVIDIA Performance Primitives 另外 如果你的项目已经使用OpenCV 其实OpenCV也是有CUDA接口的 GPU Module Introduction

入门的话其实并不需要找很多书来看,增加学习成本,参考以下两份官方指南基本就够了:

其中,个人推荐通读一下Best Practices Guide。这份文档除了讲CUDA外,还有不少并行计算相关的方法论,这是首先要掌握的。毕竟写并行程序——无论是CUDA还是MPI还是一般的多线程——之前,都需要了解要做并行优化的问题,要知道如何做profile去查问题的瓶颈(当然也就包括要能使用profiler工具、要会分析profiler的输出),要知道如何针对瓶颈去做并行的可行性分析和方案选择等等,这些都离不开方法论的指导。方法论的部分建议好好理解Best Practices Guide中提到的APOD(Assess, Parallelize, Optimize, Deploy)Weak ScalingStrong Scaling还有Performance Metrics(例如如何计算Effective Bandwidth,另外,这份文档没把计算复杂度分析列进来,但也是必须掌握的能力)这些基础。

并行计算的方法论掌握了之后,可以通读下Programming Guide前面的部分,写一些简单的CUDA程序(比如向量加法什么的)练手。其实Programming Guide更像是工具书,初学者完全没必要面面俱到啃完,特别是字母A开头后面的章节,需要的时候去查就可以了。这时候和写一般的并行程序不同的是,需要理解一些和GPU体系结构和Programming Model相关的概念,比如Device Memory Hierarchy( Register, SRAM(Shared Memory/L1/Constant Memory Cache/Texture Memory Cache), DRAM(Global Memory/Local Memory/Constant Memory/Texture Memory) )、什么是Global Memory Coalesced Access、什么是Shared Memory Bank Conflict、什么是Thread/Warp/Block/Grid、什么是Branch Divergence等等。这部分可以和Best Practices Guide互相参照着看。

接下来需要掌握一些经典的并行算法,比如parallel reduction, parallel scan等等:

有一定程度之后,进阶可以看Nicholas Wilt的《The CUDA Handbook》(http://www.cudahandbook.com/ )。我个人觉得这本书对Host Memory和CPU和GPU之间的交互原理写得非常详细,弥补了CUDA官方文档这方面的不足。例如我之前没搞懂为何pinned memory的memcpy会比pageable memory快,看了《The CUDA Handbook》的解释(pinned buffer)才明白。书中最后一部分都是一些经典例子,也值得一看。《GPU Gem3》中也有几篇CUDA相关的文章,大部分和《The CUDA Handbook》的例子重复,可以参照着读。不过,这本书一些地方也写得有点啰嗦,比如有不少指令或者API相关的表格,这些地方当作工具书使用就好。

核弹厂的官方博客([Parallel Forall NVIDIA Accelerated Computing Developer Blog](https://link.zhihu.com/?target=https%3A//devblogs.nvidia.com/parallelforall/))也有不少不错的资料,不过良莠不齐,有些文章是核弹厂的广告,有些比较水(比如某篇介绍C的restrict关键字的文章)。

另外,其他答主提到的nvidia官方CUDA sample code也是很好的学习资料,有一定程度之后,看代码比起看书反而是更为有效的提高方式。

Powered by Jekyll and Theme by solid

本站总访问量