CUDA C 高效入门第一章 -- 为什么要学习 GPU CUDA1 资料2 正文2.1 什么是并行编程为什么要并行编程2.2 CPU 和 GPU 1012.3 CPU 并行编程技术梳理2.4 CPU GPU 异构编程技术梳理3 总结1 资料本文是 CUDA C 高效入门系列第一篇主要介绍 GPU CUDA 的背景知识我们将梳理 CUDA 技术在计算机技术世界中的位置为大家学习 CUDA 提供一个全局视角。在这个过程中我们将回答传统 CPU 程序员为什么要学习 GPU CUDA或者更具体一点回答传统嵌入式软件开发者为什么要学习 GPU CUDA C。本文参考资料如下1GPU Survival Toolkit for the AI age: The bare minimum every developer must know2If GPUS Are So Good, Why Do We Still Use CPUs At All?3北京理工大学课程并行编程原理与实践4cuda-programming-guide 1.1 节2 正文2.1 什么是并行编程为什么要并行编程1并行编程和串行编程并行编程的对立概念是串行编程。串行编程是一个 CPU 处理核一次处理一个任务处理完再处理下一个任务。并行编程就是多个 CPU 处理核同时处理多个任务。2生活类比生活中串行和并行的情况都有。以盖一栋楼为例必须先打地基然后是地面建筑最后是室内装潢后一步依赖前一步整体表现为串行执行。但在具体的某一个环节中可以安排很多工种同时工作该搬砖的搬砖该砌墙的砌墙并行完成一个大任务。3为什么要并行编程简单来说是为了效率。现实生活中能并行的环节如果串行执行必然效率低下令人无法接受。典型的例子就是让一个人独立完成建一栋楼的所有工作那真是又累又慢心里又苦。而如果是一个工程队来搞说说笑笑间一栋楼就起来了。计算机作为现实世界的模拟也是一样的道理很多任务可以并行执行提升效率那么技术就会实现并行执行让软件提升效率。4计算机硬件计算机系统的发展趋势就是不断增加并行编程的效率。单核变多核在 2005 年以后因为功耗和散热的问题CPU 就从单核改为了多核如下图典型的产品是英特尔从奔腾系列改为了酷睿系列。同构变异构尽管有了多核 CPU但是很多计算密集的任务图像处理很难使用 CPU 进一步提升效率于是就有了 GPUGraphics Processing Unit图形处理器。同时存在 CPU GPU 的计算机就是异构计算机系统。2.2 CPU 和 GPU 1011CPUCentral Processing Unit中央处理器。它的设计目标就是为了解决一系列串行操作即顺序执行任务。虽然 2005 年以后人们努力通过多核提升并行效率但 CPU 的基本设计理念还是优先考虑顺序执行。2GPUGraphics Processing Unit图形处理器。GPU 专为高度并行计算而设计将更多晶体管用于数据处理单元下图绿色而 CPU 为了完成复杂的任务则将更多晶体管用于片上缓存和流控制。3CPU 与 GPU 的关系相比 CPU GPU 强化了处理核有极强的并行处理能力但 GPU 弱化了流控制因此他必须与 CPU 合作才能完成一件任务而不是彻底取代 CPU。通常情况下程序由 CPU 启动CPU 担当调度师完成串行任务GPU 分担其中大规模并行计算任务比如图形计算AI 模型推理等。具体参考If GPUS Are So Good, Why Do We Still Use CPUs At All?4从 GPU 到 GPGPU第一最初的 GPU 是专门加速实时3D渲染中并行操作的固定功能硬件简称显卡不支持可编程。第二经过几代发展到 2003 年GPU 的可编程性就已经很强大了。第三到 2006 年英伟达推出 CUDA Compute Unified Device Architecture统一计算设备架构语言以后GPU 计算已被用于加速几乎所有类型的计算工作负载从流体动力学或能量传输等科学模拟到数据库和分析等商业应用。这会的 GPU 也被成为 GPGPUGeneral-Purpose computing on Graphics Processing Units图形处理器通用计算。第四得益于 GPU 带来的算力提升2012年由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton组成的团队提交的 AlexNet 深度卷积神经网络CNN模型在著名的 ImageNet 图像识别挑战赛ILSVRC中一战成名引爆了后来的 AI 革命而 AI 革命也引爆了英伟达的市值。5GPU 市场变化早期显卡 GPU 市场基本是英伟达AMD 和英特尔三分天下但目前英特尔是 GPGPU 绝对的霸主市占率约 90%连带着 CUDA 也变成 GPGPU 编程的事实标准了。6ASIC FPGA 和 GPGPU在计算设备中还有两个技术路线一是 ASIC专用集成电路二是 FPGA现场可编程门阵列。前者是不可编程的固化集成电路执行固定的计算任务能效最高但最不灵活比如通信行业的交换机芯片。FPGA 支持使用 Verilog 进行编程能效介于 ASIC 和 GPGPU 之间但编程易用性远不如 GPGPU上手门槛还是太高。最终GPGPU 凭借其高并行吞吐量以及 CUDA 等成熟软件生态带来的优秀可编程性在 AI 加速计算领域取得了主导地位。2.3 CPU 并行编程技术梳理1多线程编程对于 Linux C 开发者主要使用操作系统提供的 pthread 系列接口。对于 C 开发者主要使用 std::thread、std::mute 这些标准库细节请参考cppreference。2OpenMP 编程这是一种编译指导语句式的并行编程模型底层基于多线程技术实现常用于让循环并行化。OpenMP 具有操作简单可移植性强的优点缺点是依赖编译器实现不灵活专业程序员用的也不多我几乎不用。3MPI 编程MPI 即 Message Passing interface也叫消息传递接口。前面的多线程编程和 OpenMP 编程都是单进程下的并行编程技术整个程序只有一个内存地址空间而 MPI 是一种多进程编程技术每个进程有独立的内存地址空间。多进程编程通常使用 socket 接口但比较麻烦MPI 在此基础上进行了很好的封装为程序员提供了一个更上层的接口细节参考北京理工大学课程并行编程原理与实践之 MPI 编程。2.4 CPU GPU 异构编程技术梳理1CUDACompute Unified Device Architecture统一计算设备架构是英伟达针对自家 GPU 推出的异构编程技术。得益于英伟达在 GPU 市场的垄断地位CUDA 已经成为 GPU 加速运算的首选编程语言/框架。CUDA 支持 CCFortranPython因此也分别叫做 CUDA CCUDA CCUDA FortranCUDA Python。如果是嵌入式 GPU 编程搞智驾机器人CUDA C 的使用率远远大于 CUDA C是绝对的首选。如果是桌面 GPU 编程搞 AI 应用CUDA Python 是绝对的首选这主要得益于 Pytorch 的广泛使用。至于 CUDA Fortran 主要用于超级计算机和数据中心级别的科学计算目标用户是拥有特定领域深厚知识如流体力学、量子化学的科学家。2OpenCLOpen Computing Language最早由苹果提出各大巨头都参与后由非营利组织 Khronos Group 维护这是一种面向各种异构系统的统一编程框架CPUGPUDSPFPGAASIC。但是种种原因OpenGL 最后败给了英伟达自家的 CUDA具体参考What about OpenCL and CUDA C alternatives?3OpenACCFor Open Accelerators由 OpenACC 组织于 2011 年推出的 CPU GPU 异构编程框架。不同于 CUDA 和 OpenGL 直接编写 GPU 代码OpenACC 通过在代码中插入特殊的编译指示依赖编译器实现异构并行加速是一种类似 OpenMP 的编译指导语句式的编程技术。优点也是操作简单可移植性强缺点也是不灵活。目前主要是科研人员用于科学计算专业程序员用的不多。4其他更小众一点的微软搞了 C AMPAMD 搞了 ROCmOpenMP 搞了 4.0 支持 GPU。3 总结一直以来大多数开发者都采用面向 CPU 的方式进行学习和开发也习惯了 CPU 顺序执行加有限并行的思维方式这种知识也早已融入我们的教育中。但是并行编程技术已经发展到 CPU GPU 的异构并行编程时代GPU 的开发已成为满足 AI 应用中并行处理需求的普遍做法软件程序也从纯逻辑开发变成逻辑 AI 模型的时代。因此CPU 程序员应该学习 GPU 开发更具体一点如果你是一名 Linux 嵌入式开发会使用 C/C那么你应该学习 GPU CUDA C通过与硬件对话的思维方式进入 AI 技术的世界。