刚开始踏入 GPU 并行计算的人,切勿急躁行事:并行计算 ”不等于“ 串行代码+并行设备,所以还是要按部就班,先花个1~2天对并行计算的基础理论开始理解,以及对并行设备(GPU架构)有基本认知,然后再开始进入 CUDA 或 OpenACC 编程,这样才不会误入歧途。一开始直接钻入计算核、线程、Warp调度器等细节,会影响您对并行架构的全局观,局限您长远的发展。

如果您要使用一些模拟器(Matlab、Amber、Ansys等)或学习器(机器学习、CAFFE、Theano等),则CUDA或OpenACC编程并不是必要的学习过程,请先厘清自己需要的应用与目的,才不会盲目失序。

此外,  并行化的最基本工作,就是”算法并行化“,  这部分您可多参考一些别人的论文,相信对您会有明显的帮助。

最后,动手操作才是学习的最关键法则,切勿对高手过度依赖,至论坛或QQ群提问时,必须学会清楚表述问题(最好有截图,想帮助您的人才知道问题在哪里),如果提出模糊的问题,很难得到对应的回复。

A. 重要的观念建立:

★★ 并行计算 ≠ 将串行代码+并行设备上 

许多初学者的最大误区,就是以为只要在机器里添加 GPU 并行计算单位,就能立即达到数十倍性能提升的功能。如果软件并非以并行方式(CUDA、OpenCL、MPI、OpenMP、OpenACC等)开发,完全得不到任何并行化的性能提升。

★ 性能提升程度:算法并行化程度 >> 并行代码优化程度

其次,也有大部分的人将串行习惯中的条件分支(if..then..else 或 case ) 大量用到并行编程之中,结果性能反而变得更差。这是因为不理解并行计算的核心:一致性与规整性。

并行计算的关键,是让绝大部分的计算核进行“相同”的工作,任何条件分子都会破坏工作的一致性,条件分支越复杂则一致性越差。同样的,如果数据结构的规整度不一致,性能也会不好。

★ 计算性能并非只以计算核数量为衡量标准  

与CPU计算性能类似,GPU计算核也有主频,整体性能以“计算核数量*主频” 为依据。此外,影响性能另一个关键因素,在于数据传输所消耗的时间,因此 PCIE 总线、CPU的QPI带宽、计算卡的显存带宽等等,也是至关重要的实际影响因素。

★★游戏卡的SLI或CrossFire功能,与多卡计算的数据交换无关 

许多人在这方面存在绝对的误解,以为游戏卡提供的 SLI(NVIDIA)或CrossFire(AMD)是多卡计算的数据传输界面,其实这两种技术与 Multi-GPU并行计算没有任何关系,专业计算卡(NVIDIA Tesla 或 AMD Firepro)都不提供这类技术

★ 并行计算只处理“适合并行的部分”而非“从头到尾”  

有许多初学者一开始钻入 CUDA 语法与结构,将 GPU 的计算核当做 CPU 的控制核使用,然后将整个 CPU 的 C/C++/Fortran 代码从头到尾全部改写成 CUDA 函数,结果性能奇差无比。

真正合理的并行计算,是将整个应用中计算量最大的部分(可能代码只占10%、但计算量超过60%)转换成并行代码,交给并行处理器去计算就可以。

★ 要善用 NSight 之类的专门除错工具 

并行计算会同时启动成千上百个线程,其中牵扯非常多的资源冲突、数据同步等可能出错的状况,绝非传统串行代码用 VC 设断点、用 printf 显示等方式能够除错的,所以学习GPU编程请同时学习 NSight 之类除错工具的使用

B. 开始上手

第一步、对硬件(GPU卡种、承载的电脑系统)要有些基本了解

许多新手会误以为任何电脑都能插上GPU卡,但使用时总因温度问题(散热不佳)导致当机,大部分“个人级”电脑主板不支持高端GPU,因此硬件选型还是有专业性。强烈建议选择大品牌设备比较有保障,DIY方式会造成不稳定的后果,是很难控制的。

CPU方面最好选择 Intel 至强级别的专业 CPU,虽然主频较低,但稳定性好。除非应用软件的特殊需求,否则CPU不需要主频太高的。至于选择单CPU主板或双CPU主板,则没有特定建议,看您的预算而定。

第二步、学习安装GPU开发环境(CUDA)

NVIDIA CUDA 提供很完整的安装包,里面包括GPU卡所需要的驱动、开发工具(主要是 nvcc 编译器、一些 run-time 执行库、将近40个文档)以及参考范例(Samples),非常齐全,并且安装过程十分简单(Linux 稍微繁琐些),建议学习的人亲自动手安装,几次之后就能非常熟练。

安装完之后,可以先打开几个 sample 试试看。Windows环境使用 Visual Studio、Linux 环境执行 make 指令即可

第三步、观看本站提供的NVIDIA官方 CUDA 教学视频(点击进入)