news 2026/7/17 6:02:10

CUDA C++ 高效入门第一章 -- 为什么要学习 GPU + CUDA

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CUDA C++ 高效入门第一章 -- 为什么要学习 GPU + CUDA

CUDA C++ 高效入门第一章 -- 为什么要学习 GPU + CUDA

  • 1 资料
  • 2 正文
    • 2.1 什么是并行编程,为什么要并行编程
    • 2.2 CPU 和 GPU 101
    • 2.3 CPU 并行编程技术梳理
    • 2.4 CPU + GPU 异构编程技术梳理
  • 3 总结

1 资料

本文是 CUDA C++ 高效入门系列第一篇,主要介绍 GPU + CUDA 的背景知识,我们将梳理 CUDA 技术在计算机技术世界中的位置,为大家学习 CUDA 提供一个全局视角。
在这个过程中,我们将回答:传统 CPU 程序员为什么要学习 GPU + CUDA,或者更具体一点,回答:传统嵌入式软件开发者,为什么要学习 GPU + CUDA C++。
本文参考资料如下:
(1)GPU Survival Toolkit for the AI age: The bare minimum every developer must know
(2)If GPUS Are So Good, Why Do We Still Use CPUs At All?
(3)北京理工大学课程:并行编程原理与实践
(4)cuda-programming-guide 1.1 节

2 正文

2.1 什么是并行编程,为什么要并行编程

(1)并行编程和串行编程:并行编程的对立概念是串行编程。串行编程是一个 CPU 处理核一次处理一个任务,处理完再处理下一个任务。并行编程就是多个 CPU 处理核同时处理多个任务。
(2)生活类比:生活中串行和并行的情况都有。以盖一栋楼为例,必须先打地基,然后是地面建筑,最后是室内装潢,后一步依赖前一步,整体表现为串行执行。但在具体的某一个环节中,可以安排很多工种同时工作,该搬砖的搬砖,该砌墙的砌墙,并行完成一个大任务。
(3)为什么要并行编程:简单来说是为了效率。现实生活中,能并行的环节如果串行执行,必然效率低下,令人无法接受。典型的例子就是让一个人独立完成建一栋楼的所有工作,那真是又累又慢心里又苦。而如果是一个工程队来搞,说说笑笑间一栋楼就起来了。计算机作为现实世界的模拟,也是一样的道理,很多任务可以并行执行,提升效率,那么技术就会实现并行执行,让软件提升效率。
(4)计算机硬件:计算机系统的发展趋势,就是不断增加并行编程的效率。
单核变多核:在 2005 年以后,因为功耗和散热的问题,CPU 就从单核改为了多核(如下图),典型的产品是英特尔从奔腾系列改为了酷睿系列。
同构变异构:尽管有了多核 CPU,但是很多计算密集的任务(图像处理)很难使用 CPU 进一步提升效率,于是就有了 GPU(Graphics Processing Unit,图形处理器)。同时存在 CPU + GPU 的计算机就是异构计算机系统。

2.2 CPU 和 GPU 101

(1)CPU:Central Processing Unit,中央处理器。它的设计目标就是为了解决一系列串行操作,即顺序执行任务。虽然 2005 年以后,人们努力通过多核提升并行效率,但 CPU 的基本设计理念还是优先考虑顺序执行。
(2)GPU:Graphics Processing Unit,图形处理器。GPU 专为高度并行计算而设计,将更多晶体管用于数据处理单元(下图绿色),而 CPU 为了完成复杂的任务,则将更多晶体管用于片上缓存和流控制。

(3)CPU 与 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 也被成为 GPGPU(General-Purpose computing on Graphics Processing Units,图形处理器通用计算)。
第四,得益于 GPU 带来的算力提升,2012年,由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton组成的团队提交的 AlexNet 深度卷积神经网络(CNN)模型,在著名的 ImageNet 图像识别挑战赛(ILSVRC)中一战成名,引爆了后来的 AI 革命,而 AI 革命也引爆了英伟达的市值。
(5)GPU 市场变化:早期显卡 GPU 市场基本是英伟达,AMD 和英特尔三分天下,但目前英特尔是 GPGPU 绝对的霸主,市占率约 90%,连带着 CUDA 也变成 GPGPU 编程的事实标准了。

(6)ASIC ,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。
(2)OpenMP 编程:这是一种编译指导语句式的并行编程模型,底层基于多线程技术实现,常用于让循环并行化。OpenMP 具有操作简单,可移植性强的优点,缺点是依赖编译器实现,不灵活,专业程序员用的也不多(我几乎不用)。

(3)MPI 编程:MPI 即 Message Passing interface,也叫消息传递接口。前面的多线程编程和 OpenMP 编程都是单进程下的并行编程技术,整个程序只有一个内存地址空间,而 MPI 是一种多进程编程技术,每个进程有独立的内存地址空间。多进程编程通常使用 socket 接口,但比较麻烦,MPI 在此基础上进行了很好的封装,为程序员提供了一个更上层的接口,细节参考:北京理工大学课程:并行编程原理与实践之 MPI 编程。

2.4 CPU + GPU 异构编程技术梳理

(1)CUDA:Compute Unified Device Architecture,统一计算设备架构,是英伟达针对自家 GPU 推出的异构编程技术。得益于英伟达在 GPU 市场的垄断地位,CUDA 已经成为 GPU 加速运算的首选编程语言/框架。CUDA 支持 C,C++,Fortran,Python,因此也分别叫做 CUDA C,CUDA C++,CUDA Fortran,CUDA Python。如果是嵌入式 GPU 编程,搞智驾机器人,CUDA C++ 的使用率远远大于 CUDA C,是绝对的首选。如果是桌面 GPU 编程,搞 AI 应用,CUDA Python 是绝对的首选,这主要得益于 Pytorch 的广泛使用。至于 CUDA Fortran 主要用于超级计算机和数据中心级别的科学计算,目标用户是拥有特定领域深厚知识(如流体力学、量子化学)的科学家。
(2)OpenCL:Open Computing Language,最早由苹果提出,各大巨头都参与后,由非营利组织 Khronos Group 维护,这是一种面向各种异构系统的统一编程框架(CPU,GPU,DSP,FPGA,ASIC)。但是种种原因,OpenGL 最后败给了英伟达自家的 CUDA,具体参考:What about OpenCL and CUDA C++ alternatives?
(3)OpenACC:For Open Accelerators,由 OpenACC 组织于 2011 年推出的 CPU + GPU 异构编程框架。不同于 CUDA 和 OpenGL 直接编写 GPU 代码,OpenACC 通过在代码中插入特殊的编译指示,依赖编译器实现异构并行加速,是一种类似 OpenMP 的编译指导语句式的编程技术。优点也是操作简单,可移植性强,缺点也是不灵活。目前主要是科研人员用于科学计算,专业程序员用的不多。
(4)其他更小众一点的:微软搞了 C++ AMP,AMD 搞了 ROCm,OpenMP 搞了 4.0 支持 GPU。

3 总结

一直以来,大多数开发者都采用面向 CPU 的方式进行学习和开发,也习惯了 CPU 顺序执行加有限并行的思维方式,这种知识也早已融入我们的教育中。但是,并行编程技术已经发展到 CPU + GPU 的异构并行编程时代,GPU 的开发已成为满足 AI 应用中并行处理需求的普遍做法,软件程序也从纯逻辑开发,变成逻辑 + AI 模型的时代。
因此,CPU 程序员应该学习 GPU 开发,更具体一点,如果你是一名 Linux 嵌入式开发,会使用 C/C++,那么你应该学习 GPU + CUDA C++,通过与硬件对话的思维方式进入 AI 技术的世界。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 6:02:06

WSL2部署OpenClaw与飞书机器人对接实战指南

1. 为什么选择WSL部署OpenClaw? 在Windows环境下直接运行OpenClaw会遇到诸多限制,主要源于两个技术层面的冲突: 首先,OpenClaw的核心组件基于Node.js生态构建,大量依赖Linux原生系统调用。比如进程管理(s…

作者头像 李华
网站建设 2026/7/17 6:01:22

C++二维数组实战:从遍历到优化,手把手实现方阵对角线求和

1. 项目概述:从“Hello World”到“方阵求和”的必经之路很多C新手在学完基础语法,比如变量、循环、数组之后,会陷入一个短暂的迷茫期:这些知识到底能用来做什么?难道就是不断地在控制台打印星星图案或者做做加减乘除吗…

作者头像 李华
网站建设 2026/7/17 5:59:54

C++自定义容器开发指南:从设计到实现的高性能数据结构实践

1. 项目概述:为什么我们需要自定义容器?在C的日常开发中,std::vector、std::map、std::list这些标准库容器几乎是我们的左膀右臂。它们稳定、高效,经过了千锤百炼。那么,为什么我们还要费时费力地去实现一个自己的容器…

作者头像 李华
网站建设 2026/7/17 5:47:55

【G780s连接远程TCP服务器案例步骤】

G780s连接远程TCP服务器案例步骤一、资料下载二、准备工作三、连接框图四、设置步骤1、TCP服务器搭建2、 设置设备参数五、数据测试博客参考地址:https://www.usr.cn/wiki/puba/AnEMcNBAO#hs28u7csg-68akuxt6uvo00 网络调试助手:https://www.cmsoft.cn/…

作者头像 李华
网站建设 2026/7/17 5:47:20

Linux文件删除操作原理与防误删实战指南

1. Linux文件删除操作的本质与风险认知在Linux系统中删除文件不像Windows那样有回收站机制,这源于Unix设计哲学中的"明确性"原则。当我们执行rm命令时,实际上是在文件系统中解除该文件的inode链接。只有当所有硬链接都被移除且没有进程占用时&…

作者头像 李华
网站建设 2026/7/17 5:41:37

鸿蒙前端调试原理与实战:HDC+ArkWeb+DevTools协同链路

1. 项目概述:鸿蒙前端调试不是“换个浏览器”,而是重建一套协同链路鸿蒙开发里提到“用DevTools调试前端页面”,很多人第一反应是打开Chrome按F12——这恰恰是踩坑的起点。我带过三届鸿蒙开发训练营,87%的新手在第一天就被卡在“D…

作者头像 李华