从开始了解高性能GPU并行计算到现在也就三个月时间,因为我所有的代码都是C++语言编写,所以在并行计算异构编程框架上选择的是C++ AMP平台。只有真正的实现超线程计算缩短了for循环之后,才感叹这技术太牛逼了!一定要掌握!
开始了解GPU并行计算还是在实验室一个刚回国师兄的讲座上,他用的是CUDA,当然师兄的编程能力超硬,所以对于这种技术都是处于羡慕状态。最开始我查了好多资料准备学习CUDA方法实现GPU并行计算,下载了cuda_9.1.85_windowshttps://developer.nvidia.com/cuda-toolkit-archive,但是后来发现CUDA作为计算性能最快的平台,它也有缺陷,就是只适用于英伟达的显卡,并且学起来比较难。这两点也是阻挡我学习CUDA的最大的原因。
沉寂了两个多月,后来开始学习基于C++AMP平台的GPU并行计算,推荐一本书Kate Gegory和Ade Miller著的《C++AMP用Visual C++加速大规模运算》非常棒,网上有电子版。先是开始搭载并行计算平台,我用的是VS2017,遇到一些问题已解决https://blog.youkuaiyun.com/weixin_41788456/article/details/104702188,对于C++AMP的学习比较容易入手,只要理解lambda表达式和parallel_for_each表达式,就可以实现并行计算的数组加减运算,对于简单的计算,性能提升不明显,只有真正进入实用阶段才能体会到GPU并行计算的巨大魅力之处!随便测试了一下之前我写的正常代码也就是CPU计算需要691s,使用并行计算之后只需要45s,这个效率还是很棒的。
浅谈CUDA、OpenCL与C++ AMP
C++ AMP出现之前已经有了两个异构编程框架:CUDA与OpenCL。CUDA是显卡厂商Nvidia于2007年推出的业界第一款异构并行编程框架。在Nvidia的大力支持下,CUDA拥有良好的开发环境,丰富的函数库,优秀的性能。但是CUDA只能被用于在Nvidia的显卡上进行异构编程,有先天的局限性。OpenCL是业界第一个跨平台的异构编程框架。它是Apple领衔并联合Nvidia,AMD,IBM,Intel等众多厂商于2008年共同推出的一个开放标准,由单独成立的非营利性组织Khronos Group管理。与C++ AMP类似,OpenCL作为一个开放的标准,并不局限于某个特定的GPU厂商,从这点上来看,Nvidia自己独家的CUDA显得很封闭了。
因为CUDA与OpenCL比C++AMP更接近硬件底层,所以前两者的性能更好,然而与C++ AMP的易编程性却要优于CUDA和OpenCL。与C++ AMP基于C++语言特性直接进行扩展不同,OpenCL是基于C99编程语言进行的相关修改和扩展,因此C++ AMP比OpenCL拥有更高层次的抽象,编程更加简单。在CUDA和OpenCL中,kernels(运行在GPU上的代码)必须被封装成特定函数,而在C++ AMP中,代码看起来整洁的多:我们只需要使用for循环中内嵌的lambda函数就能完成异构并行计算,而且它的内存模型也在一定程度上被大大简化了。所以C++AMP对于大部分人来说是更好的选择!
从编程语言的选择来看,普遍认为易编程性往往比性能更加重要,编程效率无疑是最重要的指标。更不用说开发者可以通过更换下一代GPU硬件来获得更好的性能。从这点来看,C++ AMP通过降低异构编程的编程难度,实际上也是推进了异构编程的普及。