推导各类FP16运算的算术强度:基于NVIDIA GPU性能指南的技术问询
FP16运算算术强度推导(基于NVIDIA GPU性能背景指南)
以下是NVIDIA GPU性能背景指南中列出的FP16数据运算算术强度:
| # | 运算类型 | 算术强度 | 通常受限于 |
|---|---|---|---|
| 1 | 全连接层(4096输出,1024输入,批量大小512) | 315 FLOPS/B | 计算能力 |
| 2 | 全连接层(4096输出,1024输入,批量大小1) | 1 FLOPS/B | 内存带宽 |
| 3 | 3×3窗口、步长为1的最大池化 | 2.25 FLOPS/B | 内存带宽 |
| 4 | ReLU激活函数 | 0.25 FLOPS/B | 内存带宽 |
| 5 | 层归一化 | < 10 FLOPS/B | 内存带宽 |
已完成第2项的推导:
- 浮点运算数(Flops)= 2 操作 × 1024 输入 × 4096 权重
- 内存访问量(Memory)= 2 字节 × (1024 输入读取 + 1024×4096 权重读取 + 4096 输出写入)
- → 算术强度(Flops/Memory)≈ 1 FLOPS/B
剩余4项的推导方法如下:
1. 全连接层(4096输出,1024输入,批量大小512)
全连接层每个样本的输出由输入向量与权重矩阵的乘加操作构成(每个元素对应2 FLOP),权重在批量内共享:
- 浮点运算数:批量512,总Flops = 512 × 2 × 1024 × 4096 = 4,294,967,296 FLOPs
- 内存访问量:FP16每个元素占2字节,需读取512个输入样本(512×1024元素)、权重矩阵(1024×4096元素),写入512个输出样本(512×4096元素)。总内存字节数=2×(512×1024 + 1024×4096 + 512×4096)=13,631,488字节
- 算术强度:4,294,967,296 ÷ 13,631,488 ≈ 315 FLOPS/B
3. 3×3窗口、步长为1的最大池化
针对大尺寸输入特征图(N×C×H×W,FP16),步长1的3×3池化输出尺寸近似等于输入尺寸,且输入元素可通过缓存复用:
- 浮点运算数:每个输出元素对应9个输入元素的比较操作,按9 FLOP计算,总Flops≈N×C×H×W×9
- 内存访问量:读取输入元素(仅全局内存读一次)+ 写入输出元素,总内存字节数≈2×(N×C×H×W + N×C×H×W)=4×N×C×H×W字节
- 算术强度:(9×N×C×H×W) ÷ (4×N×C×H×W)=2.25 FLOPS/B
4. ReLU激活函数
ReLU为逐元素运算,执行max(x,0)操作:
- 浮点运算数:每个元素对应1次比较运算,总Flops=N×C×H×W×1(N为批量,C×H×W为特征尺寸)
- 内存访问量:读取全部输入元素+写入全部输出元素,总内存字节数=2×(N×C×H×W + N×C×H×W)=4×N×C×H×W字节
- 算术强度:(N×C×H×W) ÷ (4×N×C×H×W)=0.25 FLOPS/B
5. 层归一化
层归一化针对每个样本的特征维度做均值、方差计算,再执行归一化与缩放偏移,以输入N×C(批量N,特征维度C)为例:
- 浮点运算数:单样本需计算均值(C次运算)、方差(3C次运算)、归一化(2C次运算)、缩放偏移(2C次运算),总Flops=N×8C=8NC
- 内存访问量:读取输入、缩放因子、偏移,写入输出,总内存字节数≈2×(NC + C + C + NC)=4NC+4C(批量较大时近似4NC)
- 算术强度:8NC ÷ 4NC=2 FLOPS/B,若考虑数值稳定的额外运算或小特征维度场景,强度会略有提升,但始终低于10 FLOPS/B,符合指南范围。
内容的提问来源于stack exchange,提问作者dabanana
相关产品推荐
相关产品推荐

