矩阵乘法是科学计算中最基础、最密集的运算之一。本文以矩阵乘法为例,对 CPU 和 GPU 的计算性能进行直观对比,帮助理解两种计算架构的本质差异。
一、CPU 与 GPU 的结构差异
CPU 设计目标是通用计算和逻辑控制,通常有 4-64 个高性能核心,每核吞吐量高,但内存带宽仅几十 GB/s。GPU 则专注于大规模并行计算,拥有上千个核心,内存带宽可达数百 GB/s,特别适合数据并行密集的数值计算任务。
| 指标 | CPU | GPU |
|---|---|---|
| 设计目标 | 通用计算、逻辑控制 | 大规模并行计算 |
| 核心数量 | 4-64 个 | 上千个 |
| 内存带宽 | 几十 GB/s | 数百 GB/s |
| 适用场景 | 控制逻辑密集 | 数据并行密集 |
二、CPU 矩阵乘法实现
最基础的 CPU 矩阵乘法使用三重循环,对 N=1024 的矩阵进行运算。在普通 i7 CPU 上,这种朴素实现耗时约 8-12 秒。
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k)
C[i*N + j] += A[i*N + k] * B[k*N + j];
三、GPU 矩阵乘法实现
GPU 版本使用 CUDA 并行化,每个线程负责计算结果矩阵中的一个元素。通过 block 和 grid 的二维划分,数千个线程同时工作。
__global__ void matMul(const float* A, const float* B, float* C, int n) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < n && col < n) {
float sum = 0.0f;
for (int k = 0; k < n; ++k)
sum += A[row * n + k] * B[k * n + col];
C[row * n + col] = sum;
}
}
四、性能对比
实际测试中,N=1024 的矩阵乘法:
- CPU(朴素实现):约 8-12 秒
- GPU(CUDA 基础版):约 5-20 毫秒
- GPU(cuBLAS 优化版):约 1-3 毫秒
性能差距可达 数百到数千倍。
五、优化思路
- 共享内存优化:利用 Shared Memory 减少全局内存访问
- cuBLAS 库:使用 NVIDIA 官方优化的线性代数库
- 分块计算:将大矩阵分块处理,提高缓存命中率
- 数据对齐:确保内存访问满足 coalesced 模式
总结
在矩阵乘法这类高度可并行化的计算任务中,GPU 相比 CPU 有压倒性优势。选择合适的实现方式(朴素 CUDA → 共享内存优化 → cuBLAS)可以进一步提升性能。理解 CPU 和 GPU 的架构差异,是进行高性能计算优化的基础。
本文来源于公众号「梁柱墙笔记」,原文链接:mp.weixin.qq.com/s/njMcQTd60…