tags | ||
---|---|---|
|
Created: 2022-05-02 11:14
以矩阵乘法为例,假设 float32 类型的矩阵 1000x1000 的矩阵和 1000x1000 的矩阵相乘.
理论上的 float32 计算次数:
- 乘法:1000 * 1000 * 1000 = 1000000000
- 加法:1000 * 1000 * 1000 = 1000000000
即一共有 10^9 次 FMA 指令(乘加)
理论上需要访问内存的次数:
- 读内存:100010002 × 4Byte = 8000000 Byte
- 写内存:100010004Byte = 4000000 Byte
假设
- 系统 CPU 有 10 个物理 core
- 每个物理 core 有 2 个逻辑 core,运行在 2GHz
- 每个物理 core 在每个 cycle 可以执行 2 条 256bit FMA 指令(乘加)
则理论上系统每秒可以计算 FMA :
10 × 2G * 2 * (256/8bits/4bytes) = 320 G
注:1个字节是 8bits,1 个 float 是 4bytes,所以 256bit 的 FMA 指令实际上是 8个 float 的 FMA 指令)
FMA 预期消耗时间: t_cpu = 1000000000 / 320G = 31.25ms
假设内存读写带宽为:20GB/s
读内存预期消耗的时间为: t_mem = 8000000Byte / 20Gb/s = 4.0ms
理论上最少需要时间: t = max(t_cpu, t_mem) = 31.25ms
如果发现上述过程实际耗时 200ms,则找到了需要优化的点。
- 为什么理论上需要的时间是 t = max(t_cpu, t_mem),而不是 t = t_cpu + t_mem?
- 计算矩阵乘法时,矩阵的每个元素会被多次访问,为什么计算访问内存量的时候没有被计算在内?