一、技术学习的方法
技术人员一般对技术学习都有自己的一套方法论。正如前面所分析,学习的方法有很多,不必拘泥于某种形式。不过对于大多数技术人员来说,肯定有一些方法是普遍适用的。比如常见的带着问题去看书、多看官方的技术文档以及多与技术专家进行交流等等。学习技术的方法不限形式,但学习技术的结果却是限于形式的即会和不会。
如果一个技术人员,只谈方法论而不真正付诸行动,除了天才,估计大多数人是无法掌握技术的内核应用的。
二、CUDA技术学习的路线
CUDA技术的学习路线,推荐还是从宏观把握主干和脉络分布,即CUDA是什么,可以做什么,应用在哪里,大数据和AI中为什么把GPU作为基础建设的一部分?GPU与CUDA有什么关系等等。把这些宏观的东西掌握后,就可以知道CUDA的来龙去脉。
然后再沿着框架,寻找可切入的部分,比如是从深度学习入手,还是直接从大模型入手?是从C++切入还是从并行算法切入?也就是一定要找一个和自身相适合的切入场景。
再后,就需要了解CUDA架构本身特别是与硬件迭代的内容关系。最后呢,就是要行动起来,无论是在哪个平台上,都要把环境先搭建起来,能够自行将软硬件的版本对应,与平台的系统对应。利用CUDA官方的工具把CUDA程序用起来,调试起来,监控分析出来。
但无论如何,想把CUDA搞好,就必须与具体的场景深入结合起来(比如深度学习),然后真正的在实践工程中开发应用和问题解决,才可能把CUDA的技术弄得彻底明白。
三、具体的技术层次和内容
在明白了技术路线后,也就是说“混个脸熟后”,就需要对其进行展开,看看如何在技术路线的指导下,掌握相关的技术知识。它可以划分为以下几个层次,并在每个层次中列举了主要的技术知识:
- 基础
在这个技术层次,不要谈什么CUDA,首先要把一些基础的知识搞得通透。至少是明明白白的。比如掌握一门常见的编程语言并能熟练使用它。其次还要有数学的基础,毕竟在CUDA的应用中会提及很多的数学公式,虽然不是很难,但一些基础的高数的知识和线代的基础还是要掌握。如果连矩阵都不知道是个啥,那CUDA应用的一个大场景就没有了。再次,要掌握并行编程。对多线程有了解,明白运行的基本原理和方式。能够在实践中使用并优化它们。最后,对基础的计算机的体系和原理要有一定的掌握,特别对内存对齐、浮点运算的处理等常见的方法知道是怎么一回事。 - CUDA技术框架
到达这个层次,需要掌握CUDA的基础理论和核心知识。学习CUDA的并行框架,SIMT,Warp,Block,Grid等等技术点。搭建平台开发环境并根据示例进行运行。在此基础上,对CUDA的相关理论知识进行反馈式学习。
分析了解CPU和GPU编程的不同,CPU和GPU的互相影响和互相调度。理论GPU中线程的概念,掌握其内存相关的技术知识如内存的层次结构及其特点。了解线程与块等的关系,运行的原理和方式以及如何更高效的进行内存管理等等。并行中的流、数据搬运、计算处理等等。
掌握初步的CUDA中的运行图的开发和应用,并在掌握基础知识点的条件下,可以对CUDA代码进行初步的优化。 - 库和相关第三方
在这个层次上,需要学习和掌握CUDA自身所带的各种库如数学相关的cuBLAS,cuBFT,cuTENSOR等等;与AI相关的如cuDNN,TensorRT,CUTLASS,cuDF等等;与并行算法相关的如Thrust,CUB等等;与图像处理有关的如NPP,CV-CUDA等等。其它还有前面提到的分布式的通信相关的MPS库等以及涉及数据处理的库等等。
另外,与CUDA相应的还有不少的第三方库,用来处理各种场景,比如Kokkos和MAGMA等等。这里就不再一一列举。 - 调优
在掌握了CUDA的较熟练的开发后,就可以多参看相关的技术提高优化的书籍和网上资料,多研究与CUDA相关的GITHUB上的开源代码或其它开源的项目的源码。特别是要学习相关的编译技术,熟悉编译器的优化过程。学习别人如何使用CUDA进行开发。学习并熟练掌握CUDA提供的相关工具如Nsight Systems和Nsight Compute来定位代码的瓶颈。特别针对内存的优化(如使用共享内存)和任务并行调度可以进行专门的训练。并不断的进行相关优化知识的学习和实践,深入掌握软件和硬件,特别是GPU中相关硬件的运行机制,并和软件深入融合。才可能写出高效的代码。 - 分布式应用
进一步掌握复杂的算法应用和分布式GPU的开发。掌握相关的编程模式和并行算法,特别是常见的库。利用MPI或NCCL等库进行多GPU的分布式并行开发。如果有场景可以进行多节点的并行计算实践。 - 并行思想
在学习了上述的知识后,就基本可以做一名熟练的GPU开发人员了。但如果想真正的成为一名高手,还有更长的路要走,需要不断的紧跟着技术的前沿,不断的更新完善自己的技术水平并最终上升到编程思想中去。形成自己的并行编程方法论。利用抽象不断的在思想理论上整合硬件平台和软件设计,形成自己的独特的技术思想栈。
四、总结
并行编程是相当复杂的。正如设计师所言,思想是最难改变的。现在的绝大多数的开发者,都是从串行到并发慢慢学习过来的。很多人可能对并发的掌握都不熟练,更不用提并行了。思想上的裹足不前,才是学习并行编程的最大的拦路虎。
即使思想过关了,就会发现有一片蓝色的技术海洋需要闯荡。这对开发者更是一个巨大的困难。正如大牛所言:Locality,Parallelism,Trade-off。这三点无一不让开发者头痛。也就是说,以往想依靠单纯的某个语言、平台、软件栈、硬件等等都已经无法实现高效的并行编程了。它是一整套的软硬件结合、编程范式和分布式应用以及相关基础的数学、编译器、机器指令等等的综合知识。努力吧,年轻人!

3085

被折叠的 条评论
为什么被折叠?



