CPU、GPU矩阵乘法计算对比

3 阅读2分钟

矩阵乘法是科学计算中最基础、最密集的运算之一。本文以矩阵乘法为例,对 CPU 和 GPU 的计算性能进行直观对比,帮助理解两种计算架构的本质差异。

一、CPU 与 GPU 的结构差异

CPU 设计目标是通用计算和逻辑控制,通常有 4-64 个高性能核心,每核吞吐量高,但内存带宽仅几十 GB/s。GPU 则专注于大规模并行计算,拥有上千个核心,内存带宽可达数百 GB/s,特别适合数据并行密集的数值计算任务。

指标CPUGPU
设计目标通用计算、逻辑控制大规模并行计算
核心数量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 毫秒

性能差距可达 数百到数千倍

五、优化思路

  1. 共享内存优化:利用 Shared Memory 减少全局内存访问
  2. cuBLAS 库:使用 NVIDIA 官方优化的线性代数库
  3. 分块计算:将大矩阵分块处理,提高缓存命中率
  4. 数据对齐:确保内存访问满足 coalesced 模式

总结

在矩阵乘法这类高度可并行化的计算任务中,GPU 相比 CPU 有压倒性优势。选择合适的实现方式(朴素 CUDA → 共享内存优化 → cuBLAS)可以进一步提升性能。理解 CPU 和 GPU 的架构差异,是进行高性能计算优化的基础。

本文来源于公众号「梁柱墙笔记」,原文链接:mp.weixin.qq.com/s/njMcQTd60…