news 2026/2/3 9:08:24

GPU 单挑 CPU:从矩阵乘法到并行计算的入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GPU 单挑 CPU:从矩阵乘法到并行计算的入门

为什么神经网络离不开 GPU?

我们已经在现实中见过太多神经网络的应用了:图像识别、语音转文字、大模型推理。这些看起来“很智能”的任务,底层其实并不神秘。

本质上,它们都是一连串的矩阵乘法。

前一次运算的输出,作为下一次运算的输入。模型越大,矩阵就越大;层数越深,乘法次数就越多。而矩阵乘法,恰恰是一种极端计算密集型操作。随着矩阵规模增长,计算量会呈平方级甚至立方级上升。

这件事在很长一段时间里,严重限制了神经网络的应用范围。

直到 2007 年,英伟达推出 CUDA 平台,事情才真正发生变化。

在合适的任务上,GPU 相比 CPU 的加速幅度,可以达到数十倍,甚至上百倍。在某些理想场景下,提升幅度可接近20 倍以上(2000%)

问题是:

为什么 GPU 能做到?它又是怎么做到的?


从四个问题出发理解 GPU

本文尝试用一个非常具体的例子——矩阵乘法,来回答四个问题:

  1. CPU 与 GPU 的核心区别是什么?

  2. 为什么同样的程序,GPU 跑得更快?

  3. GPU 是否适合加速所有任务?

  4. 我们是否真的“榨干”了 GPU 的性能?

在此之前,我们先回到最基础的地方。


矩阵乘法,本身就很“暴力”

矩阵可以看作一个二维数据结构。

  • 行索引范围:0 ~ n-1

  • 列索引范围:0 ~ n-1

为了便于说明,这里假设矩阵是正方形的,但实际中行列大小并不要求相同。

两个矩阵相乘,会得到第三个矩阵。

结果矩阵中任意一个元素,都是通过一整行一整列做点积计算得到的:对应位置相乘,再把所有乘积相加。

这个过程本身没有任何“技巧”,只有大量重复计算。


CPU 版本:老老实实,一个一个算

用 C 语言实现一个最朴素的矩阵乘法,并不复杂:

  • 三层循环

  • 逐行逐列遍历

  • 对每个元素做一次点积

如果不做任何特殊优化,在普通 CPU 上,程序通常只会使用一个线程。

对用户来说,它是严格串行的:

  • 先算C[0][0]

  • 再算C[0][1]

  • 一直算到最后一个元素

问题在于规模。

当矩阵尺寸从 1000 增长到 8000 时,执行时间会急剧上升。

在实际测试中,一个8000×8000的矩阵乘法,CPU 可能需要接近 30 分钟

这在工程上是完全不可接受的。


一个关键观察:元素之间互不依赖

仔细看算法,会发现一个非常重要的事实:

矩阵 C 中的每一个元素,都可以独立计算。

第一行的每个元素彼此独立,其他行也是如此。

没有顺序依赖,没有共享状态。

而这,正是 GPU 最擅长处理的任务类型。


GPU 的核心优势:海量并行

GPU 和 CPU 一样,也有“核心”。

但两者的设计目标完全不同:

  • CPU:核心少,单核强,负责控制和调度

  • GPU:核心多,单核弱,专注并行执行

现代 GPU 内部集成了成千上万个计算核心,可以同时运行大量线程。

举个直观的例子:

  • 对于一个2000×2000的矩阵

  • GPU 可以直接生成400 万个线程

  • 每个线程只负责计算一个元素

所有线程并行执行,相互独立,同步完成。

这也是 GPU 在矩阵运算上速度优势巨大的根本原因。


CPU 与 GPU:并不是替代关系

在硬件结构上,CPU 和 GPU 并不是谁“更高级”。

  • CPU 负责程序控制、数据准备、任务调度

  • GPU 负责执行那些高度并行、计算密集的部分

数据从 RAM 拷贝到 VRAM,需要 CPU 介入;

计算完成后,再由 CPU 把结果取回。

你可以把 CPU 理解为“项目经理”,

GPU 则是“施工队”。


CUDA 编程的基本流程

以 CUDA C 为例,一个典型的 CPU + GPU 协同流程大致如下:

  1. CPU 初始化数据(RAM)

  2. 在 GPU 上分配内存cudaMalloc,位于 VRAM)

  3. 拷贝数据到 GPUcudaMemcpy,Host → Device)

  4. 启动内核函数(Kernel)

  5. GPU 并行计算

  6. 结果拷回 CPU(Device → Host)

CUDA 的 API 设计,与标准 C 语言类似,但更强调错误返回和显式控制。


GPU 是如何组织线程的?

当一个 CUDA 内核启动时,GPU 会创建三层结构:

  • Grid(网格)

  • Block(线程块)

  • Thread(线程)

每个线程块中的线程数量必须一致。

线程和线程块都拥有自己的坐标(x, y, z)。

这些坐标,是我们在内核函数中定位“当前线程该算哪一个元素”的唯一依据。


用线程坐标定位矩阵元素

假设我们要计算一个 10×10 的矩阵:

  • 每个线程对应矩阵中的一个元素

  • 网格和块的尺寸,可能略大于矩阵尺寸

  • 因此必须在内核中做边界判断

多出来的线程什么也不做,直接退出。

这是 GPU 编程中非常常见、也非常重要的一步。


并行的本质:每个线程做同样的事

GPU 中的所有线程,执行的是同一份内核代码

区别只在于:

  • 它们拿到的线程坐标不同

  • 因此处理的数据位置不同

只要映射关系设计合理,

成千上万个线程就能同时完成整个矩阵乘法。


GPU 并不是“万能加速器”

需要特别强调的是:

GPU 并不适合加速所有任务。

它最擅长的是:

  • 高并行度

  • 低分支

  • 计算密集

  • 数据规模大

如果任务本身是串行的、逻辑复杂的,或者数据量很小,GPU 的优势反而会被数据拷贝和调度开销抵消。


那我们真的用满 GPU 了吗?

即便使用了 GPU,也并不意味着性能已经到顶。

  • 内存访问是否连续?

  • 是否使用共享内存?

  • Block 大小是否合理?

  • 是否避免了分支发散?

这些问题,都会直接影响最终性能。

很多程序“看起来在用 GPU”,但实际上只发挥了其中一小部分能力。


上 晨涧云GPU算力平台 尝试租用GPU,享受极致的GPU性能体验。


写在最后

从矩阵乘法这个最基础的例子出发,我们可以看到:

  • GPU 的优势并不神秘

  • 它来自硬件层面对并行计算的极致优化

  • CUDA 只是把这种能力,暴露给了开发者

理解这一点,对学习深度学习、并行计算,甚至是算力评估,都会非常有帮助。

如果你是第一次接触 GPU 编程,感到有些抽象是正常的。

并行思维,本身就需要时间去适应。


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

hotspot中的Java类对象如何保存虚函数

hotspot中的Java类对象如何保存虚函数 定义 在Java中,几乎所有可被继承的函数被称为虚函数。 In HotSpot, a virtual method is essentially:Any non-static, non-private, non-final instance method whose invocation target is determined at runtime based on the actual…

作者头像 李华
网站建设 2026/2/2 4:06:50

如何配置Dev-C++使用特定的编译器版本?

在 Dev-C 中配置特定编译器版本需要手动操作,以下是详细步骤:1. 安装目标编译器版本下载所需版本的编译器(如 MinGW 的特定 GCC 版本)解压至独立目录(例如:D:\MinGW-13.1)2. 配置 Dev-C打开工具…

作者头像 李华
网站建设 2026/2/3 1:10:32

为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑

为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑 引言:一场运维故障引发的思考 2023年双11凌晨,某头部电商平台的支付系统突然宕机12分钟。尽管技术团队紧急修复,但这场故障仍导致: 直接交易损失超2亿…

作者头像 李华
网站建设 2026/1/24 3:04:10

YOLO26 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

前言 本文介绍了分离与增强注意力模块(SEAM)在YOLO26中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道…

作者头像 李华
网站建设 2026/2/3 9:07:40

YOLO26 接入实时视频 - GPU 加速

1. GPU 加速优化第一版代码直接使用CPU 进行模型识别,速度根据模型大小而明显变慢yolo26n.pt 最小(5.5M),识别最快, 在 50ms左右yolo26s.pt 20.4M, 在75ms左右yolo26m.pt 44.3M, 在120ms左右yolo26l.pt 53.2M,在150ms左右yolo26x.…

作者头像 李华