想象你走进一条奶茶街,街口是“全能家庭厨房”:老板什么都会做——炒饭、拉面、煎饼果子,但一次只能出一份,慢吞吞。隔壁是“连锁食堂”:几百个工人同时动手,能做大锅菜也能做小炒,但工人要经常在不同岗位间切换,总有些调度损耗。而在街尾,有一家珍珠奶茶全自动流水线:它不做饭、不炒菜,只做一件事——把奶茶配方里的“加珍珠、加奶、封膜”这套固定动作,以每小时上万杯的速度重复执行。这条流水线,就是我们要聊的 NPU 里的专用矩阵计算单元。 AI 时代的核心计算,正如“做奶茶”一样高度重复:神经网络 90% 以上的计算量,都是矩阵乘法与累加。通用处理器(CPU)为了“万能”,把大量精力花在取指令、判断分支上;GPU 虽然并行能力强,但仍要兼顾渲染等通用任务。NPU 则把一切无关逻辑砍掉,只保留最吃的“乘累加”动作,用成千上万个计算单元组成阵列,把 AI 推理的速度推向极致。接下来,我们就从这条“奶茶流水线”的内部构造开始,一层层拆开它的秘密。

岗位关联

理解 NPU 专用矩阵计算单元的原理与优化策略,是进入 AI 芯片设计、算子性能优化、端侧推理部署等高价值岗位的第一块敲门砖。

目录
  1. 可视化演示
  2. 芯片架构定位
  3. 矩阵单元原理
  4. 关键计算算法
  5. 性能特性指标
  6. 优化映射策略
  7. 工程应用实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示Tensor Core GEMM运算流程、精度演进吞吐量对比及维度对齐检查三种核心模式,直观呈现专用矩阵计算单元的工作原理与优化策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Tensor Core GEMM运算 矩阵分片A×B经Tensor Core单周期完成D=A×B+C WMMA指令加载16×16×16分片到寄存器执行融合乘加 D = A × B + C (fused MAC) Tensor Core单周期完成整块矩阵乘加远超通用核心

芯片架构定位

奶茶街上三种店铺,恰好对应三类计算芯片:CPU 是“全能家庭厨房”,什么菜都会做,但一道菜一道菜地出;GPU 是“连锁大食堂”,工人成百上千,能同时炒很多菜,可工人们仍需在不同窗口间来回切换;NPU 则是“珍珠奶茶全自动流水线”,只做配方固定的奶茶,却把这件事做到每小时上万杯的极致。为什么 AI 时代需要这样一条“偏科”的流水线?因为神经网络的计算高度重复——矩阵乘加占据了绝对主导,继续用通用厨房来炒这盘“大菜”,成本太高、速度太慢。

从技术上看,CPU 遵循冯诺依曼架构,指令和数据都要经过内存总线搬运,而执行一个乘加操作往往要先经历取指令、译码、访存等多个步骤,真正“干活”的时间占比很低。GPU 通过大量线程缓解了并行度问题,但仍为图形渲染保留了通用性包袱。NPU 的设计定位,就是砍掉一切非核心功能,只保留矩阵乘累加所需的硬件资源——大量的 MAC 单元、紧凑的片上缓存、极简的控制逻辑。但这也带出一个新问题:程序里不是所有部分都能被加速。

店长不会让珍珠奶茶流水线去切水果、煮面条,同样 NPU 也不擅长处理控制流和复杂 IO。真正聪明的架构是“CPU 掌勺、NPU 专攻奶茶”——各司其职,整体效率才最高。这也是如今几乎所有 AI 芯片都采用异构架构的根本原因。

S=1(1−p)+pNS = \frac{1}{(1 - p) + \frac{p}{N}}
这个公式告诉我们:即使 NPU 能把矩阵计算加速 100 倍,整段程序最终的提速上限仍被“无法加速的串行部分”卡住。
  1. 并行比例 p表示整个任务中可以交给 NPU 加速的部分占总时间的比例,例如矩阵乘法耗时占比 90%。
    pp
  2. 串行比例 (1-p)剩下的无法并行化的部分,如数据预处理、控制逻辑、I/O 操作,它们仍然由 CPU 执行。
    1−p1 - p
  3. 加速倍数 N专用矩阵单元相对通用处理器的理论加速倍数,比如 MAC 阵列相对 CPU 核心数的计算吞吐提升。
    NN
  4. 分母求和串行部分时间与“并行部分被 N 倍加速后”的时间相加,得到优化后的总执行时间。
    (1−p)+pN(1 - p) + \frac{p}{N}
  5. 整体加速比 S原始时间除以优化后时间;当 N 趋于无穷大时,S 极限为 1/(1-p),可见串行部分是瓶颈天花板。
    S=1(1−p)+pNS = \frac{1}{(1 - p) + \frac{p}{N}}

矩阵单元原理

珍珠奶茶流水线的灵魂,是那个“配茶工位”。工位只做一个动作:左手取一杯茶、右手取一勺珍珠,两者混合搅拌后放进杯中。这个“一取一混一放”的原子动作,在 NPU 里就叫乘累加(MAC,Multiply-Accumulate)——取操作数 a 与 b 相乘,再把结果累加到寄存器 c 上。一条 MAC 指令完成“乘”和“加”两件事,而矩阵乘法本质上就是无数个 MAC 的叠加。

一个 MAC 单元太慢,NPU 便把成千上万个 MAC 单元排成整齐的阵列——比如 32×32 的阵列就有 1024 个 MAC。阵列规模直接决定理论峰值算力。同时,为了让工位不停歇,还要设计数据流模式:是让权重“驻留”在工位里反复使用(权重驻留),还是让输入数据“驻留”在工位里被多个权重扫描(输入驻留),抑或让部分和“驻留”在阵列中累积(输出驻留)。此外,每个工位旁都配了“小料台”——片上 SRAM 缓存,让工位就近取料,避免每次运算都跑去仓库(主内存)搬数据。

配茶工位旁边的小料台,是整条流水线不停工的秘密:珍珠、奶、茶都放在手边,一次取用、多次调配。NPU 的片上存储设计,正是把“最热的数据”放在离计算单元最近的地方,从根上缓解冯诺依曼瓶颈中的访存压力。

Cij=∑k=0K−1Aik×BkjC_{ij} = \sum_{k=0}^{K-1} A_{ik} \times B_{kj}
这个公式说明:结果矩阵中第 i 行第 j 列的元素,等于 A 的第 i 行与 B 的第 j 列逐项相乘再求和,整个过程可以拆成 K 次乘累加。
  1. 下标 i、j、k 的含义i 是 A 的行号,j 是 B 的列号,k 是内积求和的游标,遍历 0 到 K-1。
    i,j,ki, j, k
  2. 逐项相乘A 的第 i 行第 k 列元素与 B 的第 k 行第 j 列元素相乘,得到一项部分积。
    Aik×BkjA_{ik} \times B_{kj}
  3. 累加求和把所有 k 对应的部分积累加,得到一个输出元素 C_ij,这就是“乘累加”的名称由来。
    ∑k=0K−1Aik×Bkj\sum_{k=0}^{K-1} A_{ik} \times B_{kj}
  4. 扩展到整个矩阵对每个输出位置 (i, j) 重复上述 MAC 过程,就完成了整块矩阵乘法。
    Cij=∑k=0K−1Aik×BkjC_{ij} = \sum_{k=0}^{K-1} A_{ik} \times B_{kj}

关键计算算法

店长接到一张 100 杯奶茶的大订单,怎么让流水线满负荷运转?三个妙招:一是把订单拆成 10 杯一批(矩阵分块),每批在小料台上独立完成,不必来回往返大仓库;二是让珍珠沿着传送带依次流过每个工位(脉动阵列),工位不用自己去取,珍珠自己“流”到面前;三是一粒珍珠可以被多个工位共用(数据复用),省去重复搬运。这三点,正是 NPU 上矩阵计算算法的核心思想。

脉动阵列是其中最著名的设计:计算单元(PE)排列成规则网格,数据从阵列边缘流入,在相邻 PE 间“脉动式”传递,每个 PE 只与邻居通信,大大减少了全局互连和访存开销。数据复用则分为时间复用(同一数据被多次读取参与多次计算)和空间复用(同一数据同时广播给多个 PE 使用)。分块矩阵乘法则是把大的矩阵切成 b×b 的小块,让小块完全放入片上缓存,从而把片外访存降到最低。那么,分块到底带来多少收益?

至于 Winograd 变换,则是“配方优化”的极致:把卷积的乘法次数用更少的乘法替代。比如 F(2,3) 的 Winograd 卷积,原本 6 次乘法可以压缩到 4 次,以少量加法换来乘法量的大幅下降——毕竟在硬件里,乘法比加法贵得多。

店长的三个妙招合在一起,本质都是同一个目标:让流水线一直有活干,而不是等着原料。分块是备料策略,脉动阵列是传送带设计,数据复用是共享规则,Winograd 是配方改良——它们共同决定了 NPU 能把矩阵乘法的效率推到多高。

I=2×b33×b2=2b3I = \frac{2 \times b^3}{3 \times b^2} = \frac{2b}{3}
这个公式是“算术强度”的分块版本:它表示每次从内存取一个数据元素,平均能支撑多少次计算。b 越大,复用越好,计算效率越高。
  1. 块内运算量两块 b×b 矩阵相乘需要约 2b³ 次浮点运算(b³ 次乘法加 b³ 次加法)。
    2×b32 \times b^3
  2. 块内数据量A 块、B 块、C 块各含 b² 个元素,共 3b² 个数据需要从外部读入。
    3×b23 \times b^2
  3. 算术强度公式运算量除以数据量,得到每个数据元素支撑的计算次数为 2b/3。
    2×b33×b2=2b3\frac{2 \times b^3}{3 \times b^2} = \frac{2b}{3}
  4. 分块大小的约束b 受片上存储容量限制,b 太大放不进 SRAM,反而导致缓存失效、性能骤降。
    b≤SSRAM3b \leq \sqrt{\frac{S_{SRAM}}{3}}

性能特性指标

当奶茶店要采购流水线时,老板会看四个指标:每小时产多少杯(产量)、工人们是不是一直忙着(忙碌率)、每度电能做多少杯(能效比)、传送带会不会堵(带宽)。NPU 的性能考核,恰好对应这四件事。

TOPS(Tera Operations Per Second) 是衡量 NPU 理论算力的招牌数字,代表每秒执行的万亿次操作。它由 MAC 阵列规模和时钟频率直接决定:

然而,理论 TOPS 只是“纸面产量”。真正决定快慢的是 MAC 利用率——实际完成的运算量与理论峰值的比值。如果数据没喂饱、算子形状不匹配、片上存储放不下,利用率可能只有两三成。能效比(TOPS/W) 在手机、车载等端侧场景格外关键:同样做一次推理,功耗越低续航越长。带宽与时延则是隐形天花板:即使算力充裕,若数据搬运速度跟不上,计算单元依然会“等米下锅”。

店长最后发现,店里最堵的不是工位,而是那条传送带——加宽传送带(提升带宽)比添置新工位(增加 MAC)更立竿见影。NPU 的性能优化,往往不是堆算力,而是先治好“访存堵车”这个慢性病。

TOPS=2×NMAC×f1012\text{TOPS} = \frac{2 \times N_{\text{MAC}} \times f}{10^{12}}
这个公式说明:理论算力 = MAC 单元数量 × 频率 × 2(一次乘加算两次操作),再换算成“万亿次/秒”。
  1. MAC 单元总数 N_MAC芯片内集成的乘累加单元数量,例如 1024 个。
    NMACN_{\text{MAC}}
  2. 工作频率 f阵列的时钟频率,单位赫兹(Hz),1 GHz = 10⁹ 次/秒。
    ff
  3. 乘以 2 的原因一次 MAC 包含一次乘法和一次加法,业界按 2 次浮点操作(FLOPs)统计。
    2×NMAC×f2 \times N_{\text{MAC}} \times f
  4. 换算 TOPS 单位每秒 10¹² 次操作记作 1 TOPS,因此除以 10¹²。
    2×NMAC×f1012\frac{2 \times N_{\text{MAC}} \times f}{10^{12}}

优化映射策略

流水线买回来了,但如何把“100 杯奶茶的订单”变成流水线上每一秒的具体动作?这就需要一张排程表:把大订单拆成小批量、把原料摆放位置调整到工位最顺手的地方、把高峰期的任务错峰排开。在 NPU 的世界里,这张排程表就是编译器和运行时的工作。

算子映射把神经网络中的每一层(卷积、全连接、注意力机制)翻译成 MAC 阵列能执行的指令序列。同样一个卷积,可以切成不同方向的循环展开,映射质量直接影响利用率。访存优化则负责数据布局:把张量从 NCHW 重排成 NHWC,让访问更连续;把多个算子“融合”成一个,减少中间结果写回内存的次数。编译调度负责整体规划——图优化、常量折叠、内存分配,像店长一样决定谁先谁后。指令流水线则让取指、译码、执行三个环节重叠进行,流水线一旦“灌满”,每个周期都有指令完成。

店长的排程表越精细,工位的空闲时间就越少。同理,编译器把算子映射、数据布局、指令流水都安排好,NPU 才能从“纸面 TOPS”变成“真实帧率”。这也是为什么同样一颗芯片,有的团队跑出 80% 利用率,有的只有 30%——差距不在硬件,而在映射策略。

Iarith=FLOPsBytesI_{\text{arith}} = \frac{\text{FLOPs}}{\text{Bytes}}
这个公式叫算术强度:一个算子每从内存搬运 1 字节数据,平均能做多少次计算。它是判断“算得快”还是“搬得慢”的核心标尺。
  1. 计算量 FLOPs该算子需要的浮点操作总数,例如 m×n×k 的矩阵乘法约为 2mnk 次操作。
    FLOPs=2×m×n×k\text{FLOPs} = 2 \times m \times n \times k
  2. 数据搬运量 Bytes执行该算子需要从片外 DRAM 读入的字节数,包括权重、输入特征图和中间结果。
    Bytes\text{Bytes}
  3. 算术强度定义两者相除,得到每字节数据支撑的计算次数。
    Iarith=FLOPsBytesI_{\text{arith}} = \frac{\text{FLOPs}}{\text{Bytes}}
  4. Roofline 判据当算术强度大于硬件平台拐点强度时,算子处于计算受限;否则处于访存受限,需要优化访存而不是堆算力。
    Iarith≷IrooflineI_{\text{arith}} \gtrless I_{\text{roofline}}

工程应用实践

当流水线在中央工厂验证成功,店长开始把它复制到街边小店、移动餐车甚至机场候机厅。每个场景的“菜单”不同、供电能力不同、空间大小不同,于是出现了各种“轻量化版本”:把配方简化成 8 位整数量化配方,把设备体积压缩到极致。这就是 NPU 从云端走向端侧的工程故事。

在端侧推理中,手机厂商把 NPU 集成进 SoC,专门跑人脸解锁、实时翻译、背景虚化,让 AI 功能在本地完成,既低延迟又保护隐私;自动驾驶汽车则使用车规级 NPU,在毫秒级内完成车道线检测与行人识别,对能效比和可靠性要求极高。在云端训练与推理一侧,NPU 集群承担大模型训练和推理服务,通过批量调度与量化压缩,在功耗预算内提供尽可能高的吞吐。能效策略的核心之一就是 INT8 量化——把 FP32 的模型压缩成 INT8,计算量减半、访存流量降为四分之一。量化背后是这样一个映射公式:

整个工程链条离不开生态工具链:模型先用 PyTorch 训练,导出为 ONNX 等中间格式,再经厂商 SDK 和编译器转换成 NPU 指令,最后配合算子库和调试工具完成性能调优。就像奶茶店的“中央配方 + 门店 SOP + 设备手册”,一环缺了,流水线都转不起来。

从中央工厂到街边小店,NPU 的每一次落地,都是“专用化”与“场景化”的胜利:配方可以被压缩,设备可以被缩小,但那条只做矩阵乘累加的流水线初心不变——用最专一的硬件,换取最极致的效率。

q=round⁡(rs+z)q = \operatorname{round}\left(\frac{r}{s} + z\right)
这个公式把浮点数 r 映射到整数 q:s 是缩放因子,z 是零点偏移,量化后的整数再参与矩阵乘累加,最后反量化回浮点范围。
  1. 缩放因子 s由浮点数据的最大值和最小值除以量化范围(如 255)得到,决定每个整数刻度代表的浮点步长。
    s=rmax⁡−rmin⁡qmax⁡−qmin⁡s = \frac{r_{\max} - r_{\min}}{q_{\max} - q_{\min}}
  2. 零点 z浮点值 0 映射到整数后的偏移量,保证浮点 0 能精确表示,避免有符号量化出现偏差。
    z=round⁡(−rmin⁡s+qmin⁡)z = \operatorname{round}\left(\frac{-r_{\min}}{s} + q_{\min}\right)
  3. 量化映射浮点值除以缩放因子、加上零点、四舍五入,得到 INT8 整数。
    q=round⁡(rs+z)q = \operatorname{round}\left(\frac{r}{s} + z\right)
  4. 反量化恢复推理输出仍是整数,乘回缩放因子并减零点,恢复成近似浮点值,精度损失可控。
    r≈s×(q−z)r \approx s \times (q - z)

AI 应用场景

手机端侧 AI 推理

阶段:推理部署

解决的问题:传统做法是把图片上传到云端识别,不仅依赖网络、延迟高,还会泄露用户隐私。手机端集成的 NPU 可以在本地直接完成人脸解锁、场景识别、实时翻译等任务,利用专用矩阵计算单元高效执行卷积和全连接层,功耗控制在毫瓦级。

具体案例:某旗舰手机的人脸解锁流程中,AI 模型从 1 万张照片中提取 128 维特征向量,端侧 NPU 将整个特征提取过程压缩到 30 毫秒内完成,且全程不离开设备,功耗相比 GPU 方案降低约 70%。

自动驾驶环境感知

阶段:实时推理

解决的问题:自动驾驶需要在 100 毫秒内完成多个摄像头图像的语义分割与目标检测,CPU 算力不足、GPU 功耗过高。车规级 NPU 以高性能矩阵计算单元并行处理多路图像,用高能效比满足车规功耗与散热约束。

具体案例:某 L3 级自动驾驶方案在单颗 NPU 上同时运行语义分割、车道线检测和 3D 目标检测三个模型,利用分块矩阵乘法和 INT8 量化,整体延迟控制在 80 毫秒以内,整机功耗低于 15 瓦。

云端大模型推理服务

阶段:云端推理与训练

解决的问题:大语言模型推理时,权重矩阵庞大,访存成为瓶颈,通用 GPU 在成本和功耗上难以大规模扩展。云端 NPU 集群通过算子融合、内存优化和量化压缩,将矩阵乘累加效率推向极致。

具体案例:某云厂商部署 NPU 推理集群,将 7B 参数大模型的单 token 生成延迟从 50 毫秒降至 18 毫秒,单位请求功耗降低约一半;配合批处理调度,吞吐量提升 3 倍以上。

Python 演示

python54 行
import numpy as npimport time def matmul_naive(A, B):    # 朴素三层循环实现矩阵乘法, 模拟CPU逐元素计算    n = A.shape[0]    C = np.zeros((n, n))    for i in range(n):        for j in range(n):            for k in range(n):                C[i, j] += A[i, k] * B[k, j]    return C def matmul_blocked(A, B, block=32):    # 分块矩阵乘法, 模拟NPU片上缓存数据复用    n = A.shape[0]    C = np.zeros((n, n))    for i in range(0, n, block):        for j in range(0, n, block):            for k in range(0, n, block):                for ii in range(i, min(i + block, n)):                    for jj in range(j, min(j + block, n)):                        s = 0.0                        for kk in range(k, min(k + block, n)):                            s += A[ii, kk] * B[kk, jj]                        C[ii, jj] += s    return C def compute_tops(mac_count, freq_hz):    # 根据MAC阵列规模估算理论算力TOPS    flops = 2 * mac_count * freq_hz    return flops / 1e12 if __name__ == "__main__":    np.random.seed(42)    n = 128    A = np.random.rand(n, n)    B = np.random.rand(n, n)     t0 = time.time()    C1 = matmul_naive(A, B)    t1 = time.time()    print("朴素乘法耗时: {:.3f} 秒".format(t1 - t0))     t0 = time.time()    C2 = matmul_blocked(A, B, block=32)    t1 = time.time()    print("分块乘法耗时: {:.3f} 秒".format(t1 - t0))     ok = np.allclose(C1, C2, atol=1e-6)    print("两种方法结果一致: {}".format(ok))     tops = compute_tops(mac_count=1024, freq_hz=1e9)    print("1024个MAC, 1GHz理论算力: {:.2f} TOPS".format(tops))
目的:用 Python 模拟两种矩阵乘法实现(朴素逐元素 vs 分块复用),并估算 NPU 理论 TOPS,直观展示“数据复用”和“MAC 算力计算”两个核心概念。
  1. for i in range(0, n, block):按 block 大小切分行,把大矩阵化成能放入“片上缓存”的小块。
  2. s += A[ii, kk] * B[kk, jj]这就是一次乘累加(MAC):相乘再加到局部累加器 s 上。
  3. C[ii, jj] += s将小块内累积的完整内积结果写回输出矩阵,减少中间读写。
  4. flops = 2 * mac_count * freq_hz理论峰值 = MAC 数 × 频率 × 2(乘加算两次操作)。
  5. np.allclose(C1, C2, atol=1e-6)校验分块与朴素版本结果是否一致,证明分块在数值上等价。

常见误区

误区既然 NPU 跑 AI 模型那么快,干脆把 CPU 扔掉,所有任务都交给 NPU 不就行了?

正解NPU 是“单品种流水线”,只擅长矩阵乘累加这类高度规整的运算;遇到分支判断、字符串处理、系统调度,它反而又慢又笨。就像奶茶流水线做不了煎饼果子,NPU 必须由 CPU 驱动和配合,负责加载模型、分配任务、处理结果。真实芯片里 NPU 往往是 SoC 中的一个加速器模块,而非独立主机。

为何常见:人们看到 TOPS 数字高达几十上百,本能地以为“算力即一切”,忽略了“专用”二字本身就意味着适用范围狭窄。

误区买芯片只看 TOPS,认为 50 TOPS 的 NPU 一定比 30 TOPS 的快一倍。

正解TOPS 只是理论峰值,真实性能取决于 MAC 利用率。如果片上存储不够、带宽不足、算子形状与阵列不匹配,实际利用率可能只有 20%-40%。好比一条每小时能封 10000 杯的流水线,如果珍珠传送带只能供 3000 杯的原料,产量永远上不去。

为何常见:厂商宣传页最显眼的数字就是 TOPS,而利用率需要实际测试才能知道,信息不对称让买家容易盲信峰值。

误区以为把训练好的模型文件直接扔给 NPU,它就会自动运行,完全不需要代码。

正解NPU 无法直接执行 PyTorch 里的算子,必须经过编译器把计算图一步步映射成 MAC 阵列指令序列,还要做算子融合、内存分配、指令调度。就像流水线需要“排程表”才能知道先做哪杯、珍珠放多少,这个排程表就是编译器生成的指令流。

为何常见:AI 框架的“一行代码跑模型”体验让人忽略了底层编译器的存在,直到性能不达标需要手动调优时才恍然大悟。

误区既然 NPU 是“矩阵计算单元”,那它肯定只能做矩阵乘法,别的什么都干不了。

正解卷积可以转换成矩阵乘法(im2col),注意力机制的 QKV 计算本质也是矩阵乘法,甚至很多向量运算、池化操作也能映射到矩阵计算单元上执行。NPU 还配备向量单元和标量单元处理非矩阵运算,只是矩阵单元是性能王牌。

为何常见:望文生义,把“专用矩阵计算单元”理解成了“仅支持单一数学运算”,忽略了硬件单元之间相互配合的完整架构。

误区听说 NPU 都是跑推理的,训练模型必须用 GPU,所以 NPU 学习价值不大。

正解新一代 NPU 广泛支持训练:华为昇腾、Google TPU 都具备完整的训练能力,训练时矩阵乘法的规模更大、对精度更敏感,需要支持 FP16/BF16 混合精度。端侧 NPU 也在支持“端侧学习”和联邦学习,只是推理场景部署量最大、最广为人知。

为何常见:早期 NPU 主要出现在手机和安防领域,大家看到的都是推理应用,形成了“NPU 只能推理”的刻板印象。

面试题

Q1. NPU 中“专用矩阵计算单元”的“专用”主要指什么?

单选题 · easy

  • A.仅支持整数运算不支持浮点运算
  • B.专为张量和矩阵乘累加而设计← 正确答案
  • C.只能运行 Linux 一种操作系统
  • D.只支持一个固定神经网络模型

答案:B。NPU 的“专用”指硬件架构面向张量运算(尤其是矩阵乘累加)做了极致优化,而不是通用指令集。它仍支持浮点、支持运行多种模型,B 正确,其他选项都过于绝对化。

Q2. 一次 MAC(乘累加)操作完成的核心运算是?

单选题 · easy

  • A.比较两个操作数并取出较大者
  • B.执行一次乘法并累加到一个结果上← 正确答案
  • C.把数据从内存搬运到寄存器上
  • D.对数据执行一次非线性激活变换

答案:B。MAC 的英文全称是 Multiply-Accumulate,即先做乘法再做加法,如 acc += a×b,这正是矩阵乘法的最小原子操作。比较、搬运、激活都不是 MAC 的定义。

Q3. 下列哪些因素会影响 NPU 实际性能的发挥?

多选题 · mid

  • A.MAC 阵列的实际利用率← 正确答案
  • B.片外存储带宽的供给瓶颈← 正确答案
  • C.算子到指令序列的映射质量← 正确答案
  • D.芯片外壳的颜色和封装形状

答案:ABC。实际性能取决于 MAC 利用率、带宽以及编译器映射质量,这与“流水线是否满负荷、原料传送带是否够宽、排程表是否合理”是同一道理。外壳颜色显然与性能无关。

Q4. 某 NPU 集成 2048 个 MAC 单元,工作频率 1 GHz,其理论算力约为?

单选题 · mid

  • A.2.048 TOPS
  • B.4.096 TOPS← 正确答案
  • C.8.192 TOPS
  • D.1.024 TOPS

答案:B。TOPS = 2 × MAC 数 × 频率 ÷ 10¹² = 2 × 2048 × 1e9 ÷ 1e12 = 4.096 TOPS。注意每次 MAC 按 2 次操作计,这是最容易漏掉的系数。

Q5. 脉动阵列中“脉动”一词的核心含义是?

单选题 · mid

  • A.数据按电压大小以脉冲模式传播
  • B.数据在相邻计算单元间规律流动并复用← 正确答案
  • C.时钟频率随负载变化自动上下跳动
  • D.阵列连接拓扑在运行中随机动态改变

答案:B。脉动阵列的特点是每个 PE 只从邻居接收数据、计算后再传给下一个邻居,数据像血液脉冲一样规则地“流动”,从而减少全局访存。B 准确描述了这一机制。

Q6. 相比 CPU 和 GPU,NPU 的典型架构特征包括?

多选题 · easy

  • A.面向张量运算的专用数据通路← 正确答案
  • B.同等算力下能效比显著更高← 正确答案
  • C.需要专用编译器配合完成算子映射← 正确答案
  • D.完全取代 CPU 承担所有系统任务

答案:ABC。NPU 用大量 MAC 阵列和片上缓存专攻张量运算,能效比突出,且必须靠专用编译器把高层算子翻译成底层指令。但 NPU 不能取代 CPU——它只是 SoC 中的加速器。

Q7. 当某算子的算术强度(FLOPs/Bytes)较低时,意味着?

单选题 · hard

  • A.计算单元饱和度成为主要瓶颈
  • B.访存带宽更容易成为性能瓶颈← 正确答案
  • C.该算子一定无法在 NPU 上运行
  • D.编译器无需做任何性能优化工作

答案:B。算术强度低说明每个字节数据只支撑很少计算,数据搬运时间会淹没计算时间,属于“访存受限”。此时应优化数据复用、增大分块,而不是堆算力。低算术强度不代表不能运行,更不代表无需优化。

Q8. 端侧移动设备选择 NPU 的核心原因是?

单选题 · easy

  • A.降低手机整体制造成本
  • B.高能效比让 AI 推理更省电← 正确答案
  • C.兼容更多种操作系统内核
  • D.减少对云端数据中心的依赖

答案:B。端侧电池和散热预算极为有限,NPU 以更高的 TOPS/W 完成推理,显著延长续航。成本、系统兼容性不是 NPU 的根本优势,D 虽是副产物但并非“核心”原因。

Q9. INT8 量化加速 NPU 推理的根本原因是?

单选题 · hard

  • A.把浮点数值变成精度更高的数据
  • B.减少数据搬运量和计算单元开销← 正确答案
  • C.让模型在训练时收敛得更快更好
  • D.缩短反向传播时梯度的计算过程

答案:B。INT8 数据体积仅为 FP32 的四分之一,访存流量大幅下降;同时整数乘累加在硬件上更简单,同面积可放更多 MAC。量化通常在推理阶段使用,与训练收敛、反传加速没有直接关系,精度也并非变高。

Q10. 提升 NPU 上矩阵乘法 MAC 利用率的常见手段包括?

多选题 · mid

  • A.增大矩阵分块以增强数据复用← 正确答案
  • B.将相邻算子融合以减少中间搬运← 正确答案
  • C.提高片外带宽或扩大片上缓存← 正确答案
  • D.关闭编译器全部优化选项以减少开销

答案:ABC。分块提升数据复用,算子融合减少中间结果读写,带宽和缓存提升则让数据供给更充足,三者都能把 MAC 喂得更饱。关闭优化只会让利用率下降,显然错误。