驱动、bootloader、文件系统

嵌入式 SoC 与接口 12:NPU:张量计算、片上存储与 TOPS

展开合集目录
  1. 嵌入式 SoC 与接口 01:从摄像头框图认识 SoC
  2. 嵌入式 SoC 与接口 02:电平、地与逻辑阈值
  3. 嵌入式 SoC 与接口 03:差分、阻抗、端接与信号完整性
  4. 嵌入式 SoC 与接口 04:PMIC、供电时序与掉电行为
  5. 嵌入式 SoC 与接口 05:晶振、PLL、时钟树与跨时钟域
  6. 嵌入式 SoC 与接口 06:复位域、看门狗与故障恢复
  7. 嵌入式 SoC 与接口 07:ADC、DAC、参考电压与采样
  8. 嵌入式 SoC 与接口 08:MCU、MPU、SoC 与操作系统
  9. 嵌入式 SoC 与接口 09:CPU、异常、中断与多核
  10. 嵌入式 SoC 与接口 10:GPU:并行计算、图形与数据搬运
  11. 嵌入式 SoC 与接口 11:DSP:滤波、FFT、定点数与饱和
  12. 嵌入式 SoC 与接口 12:NPU:张量计算、片上存储与 TOPS
  13. 嵌入式 SoC 与接口 13:ISP:从传感器 RAW 到可用图像
  14. 嵌入式 SoC 与接口 14:视频编解码器与图像加速器
  15. 嵌入式 SoC 与接口 15:Boot ROM、Bootloader 与系统启动
  16. 嵌入式 SoC 与接口 16:NOR、NAND、擦写与 ECC
  17. 嵌入式 SoC 与接口 17:eMMC:总线模式、内部管理与分区
  18. 嵌入式 SoC 与接口 18:安全启动、固件签名与 A/B 升级
  19. 嵌入式 SoC 与接口 19:寄存器、地址空间与 MMIO
  20. 嵌入式 SoC 与接口 20:SRAM、DDR、带宽与延迟
  21. 嵌入式 SoC 与接口 21:Cache、一致性与可见性
  22. 嵌入式 SoC 与接口 22:DMA、描述符与环形缓冲
  23. 嵌入式 SoC 与接口 23:MMU、IOMMU 与三种地址
  24. 嵌入式 SoC 与接口 24:AXI、AHB、APB 与片内互连
  25. 嵌入式 SoC 与接口 25:零拷贝、dma-buf 与缓冲生命周期
  26. 嵌入式 SoC 与接口 26:共享内存、Mailbox 与核间通信
  27. 嵌入式 SoC 与接口 27:GPIO、Pinmux、上下拉与引脚状态
  28. 嵌入式 SoC 与接口 28:UART、RS-232 与 RS-485
  29. 嵌入式 SoC 与接口 29:I²C:地址、ACK、重复起始与上拉
  30. 嵌入式 SoC 与接口 30:SPI、QSPI 与 Flash 访问
  31. 嵌入式 SoC 与接口 31:定时器、PWM、输入捕获与编码器
  32. 嵌入式 SoC 与接口 32:I²S、PCM、TDM 与音频时钟
  33. 嵌入式 SoC 与接口 33:CAN 与 CAN FD:仲裁、帧和错误状态
  34. 嵌入式 SoC 与接口 34:USB:角色、端点、传输类型与 UVC
  35. 嵌入式 SoC 与接口 35:SD 与 SDIO:存储卡和外设功能
  36. 嵌入式 SoC 与接口 36:Ethernet:MAC、PHY、MDIO 与吞吐
  37. 嵌入式 SoC 与接口 37:PCIe:链路、枚举、BAR、中断与 DMA
  38. 嵌入式 SoC 与接口 38:MIPI 全景:CSI、DSI 与 PHY
  39. 嵌入式 SoC 与接口 39:摄像头接入:供电、复位、MCLK 与配置
  40. 嵌入式 SoC 与接口 40:CSI-2:数据类型、虚拟通道与带宽预算
  41. 嵌入式 SoC 与接口 41:显示链路:DSI、RGB、LVDS 与 HDMI
  42. 嵌入式 SoC 与接口 42:设备树、probe、IRQ 与资源生命周期
  43. 嵌入式 SoC 与接口 43:实时性、中断延迟与优先级反转
  44. 嵌入式 SoC 与接口 44:万用表、示波器、逻辑分析仪与 JTAG
  45. 嵌入式 SoC 与接口 45:综合排障:无图、花屏、丢帧与 NPU 慢
  46. 嵌入式 SoC 与接口 46:选修:Wi-Fi、Bluetooth 与蜂窝通信
  47. 嵌入式 SoC 与接口 47:选修:工业以太网、EtherCAT 与 TSN
  48. 嵌入式 SoC 与接口 48:选修:FPGA、流水线与时序约束
  49. 嵌入式 SoC 与接口 49:选修:长距离视频 SerDes 与 A-PHY
  50. 嵌入式 SoC 与接口 50:选修:温度、功耗、EMC 与长期可靠性
嵌入式 SoC 与接口 12:NPU:张量计算、片上存储与 TOPS的封面

第 12 / 50 课 · 核心课程。返回课程合集。

NPU 加速的是一组受支持的计算

NPU 通常面向神经网络张量运算,但不同产品的算子、数值格式、形状和编译限制差别很大。它不是另一个可以随意执行 Python 的 CPU。模型先被编译或转换成设备可执行计划,运行时再管理输入、输出和任务完成。

CPU 承担调度与不支持的处理,NPU 承担可映射的计算。图中途回退到 CPU 会增加同步、布局转换和数据搬运,算子数量占比很小的回退也可能成为瓶颈。

片上复用决定能否喂饱计算单元

矩阵和卷积会重复使用权重与输入。片上 SRAM 可以暂存分块数据,减少访问 DDR;但容量有限,切块方式会影响重复读取和中间结果写回。

可以用粗略下界分析:计算时间至少为工作量除以可用计算率,搬运时间至少为数据量除以有效带宽。若二者能够部分重叠,总时间仍不可能低于两者较大值;这不是精确调度模型。

TOPS 必须带条件读

比较前确认精度、稀疏条件、乘加算一次还是两次、峰值还是实测。8 TOPS 不意味着每个模型都能获得每秒 8 万亿有效运算。batch、形状、内存和编译覆盖都会改变利用率。

模型实际转换和数值验证接海思 NPU 系列,本课先解释硬件为什么受这些条件限制。

NPU:张量计算、片上存储与 TOPS:张量与算子、SRAM 分块复用、DDR 与利用率

练习与参考结论

构造 1 GOP 工作量、100 MB 搬运、1 TOPS 可用计算率和 5 GB/s 有效带宽。计算下界为 1ms,搬运下界为 20ms;仅提高计算峰值无法消除搬运限制。

单位全部使用十进制,并保持 OP 计数口径一致。代码输出的是假设条件下的下界,不是芯片跑分。

配套代码

下载包包含独立运行所需文件,使用 Python 标准库;这里验证机制和计算,不代表开发板测量结果。

运行本课机制与计算示例

查看完整代码:main.py
"""十进制单位,忽略重叠细节的资源下界,不是芯片实测。"""


def bounds(operations, bytes_moved, ops_per_second, bytes_per_second):
    if min(operations, bytes_moved) < 0 or min(ops_per_second, bytes_per_second) <= 0:
        raise ValueError("invalid workload or rate")
    compute = operations / ops_per_second
    transfer = bytes_moved / bytes_per_second
    return compute, transfer, max(compute, transfer)


def main():
    compute, transfer, lower = bounds(1e9, 100e6, 1e12, 5e9)
    assert compute == 0.001 and transfer == 0.02 and lower == 0.02
    print(
        "compute/transfer/optimistic lower bound ms:",
        compute * 1000,
        transfer * 1000,
        lower * 1000,
    )
    assert bounds(1e9, 100e6, 2e12, 5e9)[2] == lower
    print("doubling compute peak does not reduce this transfer bound")


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/驱动、bootloader、文件系统/嵌入式SoC与接口/12-NPU:张量计算、片上存储与 TOPS/code' && python3 main.py

延伸阅读

上一课:DSP:滤波、FFT、定点数与饱和 · 下一课:ISP:从传感器 RAW 到可用图像