想象你走进一家叫“蓉城小馆”的川菜馆。老板算了一笔账:十桌客人有九桌都点水煮鱼。于是他没有请一群只会做单一动作的小工,而是专门请来一位“神级大厨”——这位大厨颠一次勺,16 行、16 列、16 层,共 4096 份食材同时入味。这就是华为昇腾达芬奇架构的故事:AI 计算里 90% 以上的工作量是矩阵乘加,那就造一个专门“颠勺”的单元——Cube。围绕这位大厨,还有负责逐份加工食材的配菜师傅(向量单元)、拿单子指挥节奏的前厅经理(标量单元),以及一整套“备料”体系(L0/L1/L2 存储),保证食材永远在手边。这篇文章带你逛一圈这个“AI 厨房”:从大厨的绝活、菜谱(指令集)、备料流程(数据搬运),再到和隔壁 GPU“西式流水线厨房”的对比。读完你会真正明白,国产 AI 芯片到底是怎么“算”的。

岗位关联

理解达芬奇架构,等于拿到国产 AI 芯片的算力路线图。无论你将来做模型训练、推理部署还是算子调优,都能一眼看出“瓶颈在计算还是在搬运”,写出真正跑得快的 AI 程序。

目录
  1. 可视化演示
  2. 架构设计理念
  3. 计算单元组成
  4. Cube矩阵运算
  5. 指令集设计
  6. 存储与数据流
  7. GPU架构对比
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示达芬奇Cube矩阵乘法单元原理、存储层次数据搬运优化与NPU-GPU架构差异对比,切换模式理解国产AI芯片核心技术路线。

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

Cube矩阵乘法单元原理 Cube单元单周期完成16x16x16矩阵乘法,是达芬奇架构的核心计算引擎 输入矩阵A和B分块加载至LBUF,输出矩阵C写回高带宽存储 C[m,n] = Σ A[m,k] × B[k,n] Cube单元通过3D矩阵乘法加速器实现高吞吐AI计算

架构设计理念

蓉城小馆的老板翻完三个月的流水,发现一个规律:十桌客人有九桌都点水煮鱼。他没想着多雇几个帮厨,而是做了一件大胆的事——把整个厨房按水煮鱼的流程重新设计:灶台、案板、调料架全为这道菜服务,还请来一位只练“颠勺”这一招的神级大厨。这个决策,就是达芬奇架构的第一条设计理念:认清主力负载,然后为它量身定制。

AI 计算的世界里藏着同样的规律:卷积神经网络靠卷积核做矩阵乘,全连接层做矩阵乘,Transformer 的注意力机制里的 Q、K、V 变换还是矩阵乘——矩阵乘加操作占了神经网络计算量的绝大部分。华为工程师因此决定:不为所有场景造一个“万金油”芯片,而是为矩阵运算修一条专用“快车道”。

这就是达芬奇架构(DaVinci Architecture)的出发点:围绕矩阵乘这个核心负载做软硬协同设计。每个 AI Core 就像一个小厨房,内部集成三类单元——Cube 专心做矩阵乘,Vector 处理逐元素运算,Scalar 负责流程控制。配套的 CANN 软件栈(编译器、算子库)在设计之初就和硬件对表,让“菜谱”和“锅”一起定做,而不是先造锅再编菜谱。

单条矩阵指令的乘加数=16×16×16=4096\displaystyle \text{单条矩阵指令的乘加数} = 16 \times 16 \times 16 = 4096

1. 第一个 16(行数):Cube 一次从矩阵 A 中取 16 行数据,这是大厨一次捧起的“食材行数”。

16行16_{\text{行}}

2. 第二个 16(列数):Cube 同时处理矩阵 B 的 16 列数据,对应大厨一次铺开的“锅位列数”。

16列16_{\text{列}}

3. 第三个 16(深度):乘积累加的共享维度 K,即 A 的列与 B 的行重叠的深度,相当于“夹心层数”。

16深度16_{\text{深度}}

4. 连乘等于 4096:三个维度同时展开,得到一条指令触发的乘加单元总数,这就是 16×16×16 Cube 名字的由来。

16×16×16=409616 \times 16 \times 16 = 4096

老板的“水煮鱼专线”改造完成后,大厨一次颠勺能让 4096 份食材同时入味。这条专线,就是矩阵世界里的“下单速度”——别人一道菜一道菜地炒,它一次炒一整锅。

计算单元组成

回到蓉城小馆的后厨,你会发现真正运转的是三个人的配合:大厨只负责颠勺炒大锅菜,一勺下去十几份同时熟;配菜师傅站在旁边,把每片鱼、每根豆芽单独切片、码味;前厅经理则拿着点菜单指挥节奏,决定下一道菜做什么、什么时候喊“出锅”。三个人各管一段,谁也不抢谁的活。

一个 AI Core 就是这样的“AI 厨房三人组”。大厨对应 Cube 单元,配菜师傅对应 Vector 单元,前厅经理对应 Scalar 单元。三者共用一套案板和储物架(片上存储缓冲),通过内部总线交换数据,完成一个算子的完整流水线。

  • Cube 单元:16×16×16 的矩阵乘加阵列,处理卷积、全连接、注意力矩阵乘这类“大锅菜”。
  • Vector 单元:向量流水线,擅长激活函数(ReLU)、归一化(BatchNorm)、逐元素加乘这类“每片食材单独处理”的活。
  • Scalar 单元:标量运算,负责地址计算、循环控制、分支判断,是整个厨房的“指挥调度”。

AI Core=Cube+Vector+Scalar+本地存储\displaystyle \text{AI Core} = \text{Cube} + \text{Vector} + \text{Scalar} + \text{本地存储}

1. Cube(矩阵引擎):承担乘累加密集计算,是算力主力,对应大厨的颠勺手艺。

Cube→矩阵乘加\text{Cube} \to \text{矩阵乘加}

2. Vector(向量引擎):处理逐元素操作,为矩阵结果做“精加工”,对应配菜师傅的刀工。

Vector→逐元素运算\text{Vector} \to \text{逐元素运算}

3. Scalar(标量引擎):执行循环、跳转、地址运算,控制数据流向,对应前厅经理的调度。

Scalar→流程控制\text{Scalar} \to \text{流程控制}

4. 本地存储:L0/L1 等片上缓冲,为三大单元就近供料,避免频繁跑外部内存。

本地存储→数据中转\text{本地存储} \to \text{数据中转}

这三个人在同一个案板上配合:经理喊单,配菜师傅备料,大厨颠勺。AI Core 之所以高效,正因为三类单元各司其职、并行运转,让“指挥、加工、爆炒”同时进行。

Cube矩阵运算

大厨的“一次颠勺”到底神奇在哪?颠勺时,一锅 16 行、16 列的食材,每一格都要和调料层逐一接触、融合——食材是矩阵 A 和矩阵 B,融合的结果就是输出矩阵 C。这个动作在数学上叫“矩阵乘累加”,昵称 MAC(Multiply-Accumulate)。

Cube 是达芬奇架构的灵魂,它把 4096 个乘加器排成一个三维阵列,一次执行一个 16×16×16 的矩阵乘累加块。每个乘加器负责结果矩阵 C 中的一个元素,把 16 层乘积逐层“叠”进去。值得注意的是,这些乘加器全程并行:大厨不是一格一格地炒,而是整锅同时翻。

矩阵乘法 C = A × B 的规则是:结果里第 i 行第 j 列的元素,等于 A 的第 i 行与 B 的第 j 列逐对相乘后求和。卷积核滑动、全连接权重计算、注意力打分,本质上都在反复做这个动作——这也是为什么 Cube 能通吃主流神经网络。

Ci,j=∑k=1KAi,k×Bk,j\displaystyle C_{i,j} = \sum_{k=1}^{K} A_{i,k} \times B_{k,j}

1. C(i,j) 是结果格子:位于结果矩阵第 i 行第 j 列,它的值由 A 的第 i 行和 B 的第 j 列共同决定,相当于出锅后盘子里那一格菜。

Ci,jC_{i,j}

2. 求和符号 Σ:从 k=1 扫到 K,把 K 个乘积全部加起来,相当于把 16 层夹心逐一压实。

∑k=1K\displaystyle \sum_{k=1}^{K}

3. A(i,k)×B(k,j):A 的第 i 行第 k 列与 B 的第 k 行第 j 列相乘——k 是 A 和 B 共用的“媒人维度”,这一格乘积就是一层夹心。

Ai,k×Bk,jA_{i,k} \times B_{k,j}

大厨每颠一次勺,等于把一锅食材按 16 层“夹心”压入、融合。层数越多,这道菜的味道层次越丰富;同理,K 越大,矩阵乘的信息融合越深。

指令集设计

后厨墙上贴着一张“标准动作手册”:颠勺、切丝、报单。大厨听到“颠勺”两个字,整条手臂的动作一次到位——他不需要听到 4096 个微小的指令,比如“动一下左手”“再动一下右手”。“颠勺”两个字,就是一条指令。

达芬奇架构的指令集也分成三类,对应三类单元:矩阵指令(给 Cube,一条指令驱动整个矩阵阵列)、向量指令(给 Vector,一条指令处理一组数据)、标量指令(给 Scalar,做循环和跳转)。最特别的是矩阵指令——它属于典型的“单指令多数据”风格,一条指令管住一整块 16×16 的数据。

为什么这很重要?因为指令本身有开销:取指、译码、发射都要花时间和功耗。如果一条指令只算两个数,指令开销占比就很高;如果一条指令算 4096 个数,指令开销就被摊薄到几乎可以忽略。达芬奇选择“把指令做宽”,让最频繁的矩阵乘每一趟都满载运行。CANN 工具链的任务,就是把神经网络算子编译成这些宽指令序列。

单指令操作数=16×16=256\displaystyle \text{单指令操作数} = 16 \times 16 = 256

1. 16×16 操作数:一条矩阵指令同时把 A 的一个 16×16 数据块和 B 的一个 16×16 数据块送入 Cube,共 256 个输入数。

16×16=25616 \times 16 = 256

2. 累加深度 16:每个输出元素还要沿共享维度做 16 次乘积累加,把三维阵列填满。

×16深度\times 16_{\text{深度}}

3. 最终效果:指令数量大幅减少,指令发射和译码开销占比显著下降,这正是“宽指令”设计的收益。

指令数↓⇒开销占比↓\text{指令数} \downarrow \Rightarrow \text{开销占比} \downarrow

“颠勺”两个字管住 4096 个动作——这就是指令集设计的精髓:让最常做的动作,用最短的命令完成。矩阵指令越宽,指令流水线越省,Cube 的利用率就越高。

存储与数据流

大厨颠勺再快,如果每次要一勺调料都得跑到三条街外的批发市场去买,锅早就烧穿了。所以蓉城小馆设计了三级存放:手边调料盒(L0)、厨房冰箱(L1)、后院仓库(L2)。出菜速度的秘密,一半在颠勺,一半在“备料”。

达芬奇架构的存储层次正是这个思路。芯片外的 HBM 内存是“批发市场”,容量大但远;芯片上则铺开 L0/L1/L2 三级缓冲,越靠近 Cube 越贵越快。L0 紧贴 AI Core 内部,延迟最低;L1 在一个 AI Core 集群内共享,缓存算子中间数据;L2 是多个核心共享的大容量片上缓存,用来减少 HBM 访问。

真正考验功力的是数据搬运优化。工程师常用三招:一是数据分块,把大矩阵切成 16×16 的小块,让数据在缓存里反复复用;二是乒乓缓冲,准备两个缓冲区交替使用——Cube 算这一块时,搬运引擎同时预取下一块,把等待时间“藏”起来;三是算子融合,把多个算子的中间结果留在片上,避免写回又读出的来回折腾。

有效算力=计算量计算时间+搬运时间\displaystyle \text{有效算力} = \frac{\text{计算量}}{\text{计算时间} + \text{搬运时间}}

1. 分子:计算量:矩阵乘总共要做的乘加次数,这是大厨必须完成的“炒菜总量”。

计算量\text{计算量}

2. 分母第一项:计算时间:Cube 阵列满载执行这些乘加所需的时间,对应大厨颠勺的时间。

计算时间\text{计算时间}

3. 分母第二项:搬运时间:数据从各级存储送到 Cube 的时间,对应备料和端菜的时间。

搬运时间\text{搬运时间}

4. 整体含义:只要搬运时间不可忽略,有效算力就必然低于峰值——所以“备料”和“炒菜”一样重要。

有效算力<峰值算力\text{有效算力} < \text{峰值算力}

备料备得好,大厨不停勺。好的存储设计,就是让食材永远在触手可及的地方——这是达芬奇架构能把理论算力变成真实吞吐的关键所在。

GPU架构对比

隔壁开了一家西式快餐厨房,老板的思路完全不同:他雇了一万个小工,每人只守一个巴掌大的烤位,操作简单、动作统一。什么菜来了都能做,但一道菜要动员大量人手。蓉城小馆则相反:一位神级大厨配一条专线,在招牌菜上快到极致。这就是 GPU 与达芬奇 NPU 的路线分叉。

GPU(比如 NVIDIA A100)走的是“众核”路线:集成数千个通用小核心,每个核心一次处理少量数据,靠成千上万的线程并行取胜。这种设计非常灵活,既能做图形渲染,也能跑科学计算,连游戏都能管。而达芬奇架构走的是“大核”路线:AI Core 中的 Cube 占据主导面积,一条矩阵指令完成 4096 次乘加,矩阵密集计算效率极高。

两种路线各有天地:在卷积、全连接、注意力这类高度规则、矩阵密集的 AI 负载上,NPU 的算力密度(每平方毫米或每瓦的算力)更高;但在任务多变、算子零散、分支繁多的场景,GPU 的通用性和灵活性更从容。这也是为什么业界常说“GPU 是全能选手,NPU 是专才”。

算力密度=每周期 MAC 数核心面积\displaystyle \text{算力密度} = \frac{\text{每周期 MAC 数}}{\text{核心面积}}

1. 分子:每周期 MAC 数:一个时钟周期内,所有乘加单元完成的总乘加次数,相当于一次颠勺的“出菜量”。

每周期 MAC 数\text{每周期 MAC 数}

2. 分母:核心面积:单个计算核心占用的芯片面积,相当于大厨灶台占的厨房面积。

核心面积\text{核心面积}

3. 比值意义:同样的晶体管预算,谁在单位面积里塞进更多有效乘加器,谁的算力密度就更高。

MAC面积\frac{\text{MAC}}{\text{面积}}

一万个小工和一位神级大厨,没有绝对优劣,只有“招牌菜”之争。GPU 的灵活让它无处不在,而达芬奇 NPU 在矩阵乘这条赛道上,把“专”字发挥到了极致。

AI 应用场景

大模型训练加速

阶段:模型训练

解决的问题:千亿参数大模型的核心计算量集中在注意力矩阵乘和全连接层上。传统方案依赖 GPU 的 Tensor Core 或 CPU,矩阵乘法吞吐受限于通用核心的调度开销。昇腾 NPU 用 Cube 把矩阵乘变成“一条指令 4096 次乘加”,配合高带宽存储层次,显著提升训练集群的算力利用率。

具体案例:某团队用昇腾 910 集群训练百亿参数大模型时,将注意力层的 QKV 矩阵乘张量化,并通过 CANN 算子融合减少中间张量搬运,训练吞吐相比优化前提升接近 2 倍。

边缘推理部署

阶段:推理部署

解决的问题:智慧城市摄像头端做实时人体检测,对功耗、时延、成本都极其敏感。传统 GPU 功耗高、体积大,不适合放进取证箱。昇腾 310 内置达芬奇架构,Cube 处理卷积、Vector 做后处理(如 NMS),L2 缓存复用相邻帧数据,在低功耗下跑满视频流。

具体案例:某安防厂商在边缘盒子中部署昇腾 310,同时处理 8 路 1080P 视频流做目标检测,端到端时延控制在十几毫秒,整机功耗仅十几瓦。

算子开发与调优

阶段:算子开发

解决的问题:标准算子库覆盖不了新研究的网络结构时,需要手工编写高性能算子。新手容易把矩阵乘写成逐元素循环,浪费 Cube 能力。掌握达芬奇指令集后,可以把矩阵乘部分映射到 Cube 指令、逐元素部分映射到 Vector 指令,并用 L1 缓冲做数据分块复用。

具体案例:一位算法工程师在 CANN 上用 TBE 编写自定义卷积算子,通过 Cube 分块和乒乓缓冲,把单算子性能提升了 3 倍以上,让新模型得以在昇腾上落地。

Python 演示

python54 行
# DaVinci Cube simulator: tiled matmul + data movement statsclass CubeUnit:    def __init__(self, size=16):        self.size = size        self.mac_times = 0   # 累计乘加次数        self.move_count = 0  # 累计数据搬运次数     def one_instruction(self, a, b):        # 一条矩阵指令: C[16][16] = A[16][16] x B[16][16]        c = [[0 for _ in range(self.size)] for _ in range(self.size)]        for i in range(self.size):            for j in range(self.size):                acc = 0                for k in range(self.size):                    acc += a[i][k] * b[k][j]  # 乘累加核心动作                c[i][j] = acc        self.mac_times += self.size * self.size * self.size        return c     def matmul(self, a, b):        # 大矩阵按 16x16 分块, 每块对应一次 Cube 指令        n = len(a)        c = [[0 for _ in range(n)] for _ in range(n)]        for i0 in range(0, n, self.size):            for j0 in range(0, n, self.size):                for k0 in range(0, n, self.size):                    self.move_count += 1  # 记录一次数据搬运                    a_block = [row[k0:k0 + self.size] for row in a[i0:i0 + self.size]]                    b_block = [row[j0:j0 + self.size] for row in b[k0:k0 + self.size]]                    c_block = self.one_instruction(a_block, b_block)                    for i in range(self.size):                        for j in range(self.size):                            c[i0 + i][j0 + j] += c_block[i][j]  # 累加各块结果        return c  def main():    n = 32    # 构造两个可验证的矩阵: b 是 a 的转置    a = [[i * n + j for j in range(n)] for i in range(n)]    b = [[i * n + j for i in range(n)] for j in range(n)]    cube = CubeUnit()    c = cube.matmul(a, b)    # 用朴素三重循环校验分块结果    expect = [[sum(a[i][k] * b[k][j] for k in range(n)) for j in range(n)] for i in range(n)]    ok = c == expect    print("Result check:", "OK" if ok else "FAIL")    print("Total MACs:", cube.mac_times)    print("Move counts:", cube.move_count)    print("MACs per move:", cube.mac_times // cube.move_count)  if __name__ == "__main__":    main()
目的:用 Python 模拟达芬奇 Cube 的分块矩阵乘,统计一条指令的乘加次数和数据搬运次数,直观展示“一次搬运换回大量计算”的复用收益。
  1. class CubeUnit:用 16×16 的“虚拟 Cube”模拟真实硬件,所有乘加走“一条指令”。
  2. def one_instruction(self, a, b):对应真实 Cube 的矩阵指令,一次算完一个 16×16 输出块。
  3. acc += a[i][k] * b[k][j]乘累加核心动作,神经网络里反复发生的基本运算。
  4. self.mac_times += self.size * self.size * self.size每执行一条指令就积累 4096 次乘加。
  5. for k0 in range(0, n, self.size):大矩阵按 16×16 分块,沿共享维度 k0 循环切块。
  6. self.move_count += 1记录每次从缓存把数据块搬进 Cube 的动作。
  7. expect = [[sum(...) for j in range(n)] for i in range(n)]用朴素三重循环校验分块结果是否正确。

常见误区

误区“我以为昇腾 NPU 就是把很多个 CPU 核心放在一块芯片上,靠堆核心数量来提升速度,跟多核服务器差不多。”

正解达芬奇的核心是 Cube——一个专门做矩阵乘加的大阵列。单个 16×16×16 Cube 用一条指令就完成 4096 次乘加,这是“专用单元”而不是“通用核心”。就像请一位只会做水煮鱼的顶级大厨,比请十个什么菜都会一点的帮厨做招牌菜更快。NPU 的算力来自“专”,而不只是“多”。

为何常见:因为多核 CPU 和 GPU 的“堆核”宣传深入人心,大家习惯用旧框架理解一切加速芯片。

误区“GPU 有 Tensor Core,NPU 有 Cube,它们不都是加速矩阵乘的东西吗?换个名字而已。”

正解两者都加速矩阵乘,但设计哲学不同。Tensor Core 是 GPU 里的一块“附加加速器”,周围仍然是大量通用小核;达芬奇的 AI Core 以 Cube 为主体,Vector 和 Scalar 只做辅助,矩阵指令是“主角”而非“配角”。好比西式厨房里的“预制菜微波炉”和专做水煮鱼的独立灶台——能力边界和使用方式完全不同。

为何常见:从“功能”层面看两者都算矩阵乘,容易忽略架构层面的主次关系。

误区“芯片标称的 TOPS 越高,跑模型就一定越快,选贵的准没错。”

正解有效算力等于计算量除以(计算时间加搬运时间)。如果数据搬运跟不上,Cube 只能空转等数据。达芬奇用 L0/L1/L2 三级缓冲、乒乓预取、数据复用来解决“喂数据”问题。就像大厨颠勺再快,食材没备好也只能干等。所以评价芯片要问一句:它喂得饱自己吗?

为何常见:厂商宣发总爱强调峰值,而峰值是“理想状态”下的数字,实际负载很难达到。

误区“达芬奇架构那么专,是不是只认几种写死的模型?新网络一出来就废了?”

正解Cube 负责矩阵密集部分,Vector 处理激活、归一化这类逐元素运算,Scalar 做流程控制,配合可编程指令集与 CANN 工具链,可以把各类神经网络算子编译成指令序列。矩阵乘是神经网络的基本动作——卷积、全连接、注意力都建立其上,所以“专精”不等于“写死”,它依然是可编程的芯片。

为何常见:把“专用硬件”误解为“固化的电路”,忽略了指令集和软件栈带来的灵活性。

面试题

Q1. 达芬奇架构中,专职执行矩阵乘加运算的单元是?

单选题 · easy

  • A.Cube 立方体单元← 正确答案
  • B.Vector 向量单元
  • C.Scalar 标量单元
  • D.通用 CPU 核心

答案:A。Cube 是达芬奇架构的矩阵乘加引擎,一次执行 16×16×16 的乘累加;Vector 负责逐元素运算,Scalar 负责流程控制。就像大厨颠勺是 Cube 的活,配菜和报单是另外两人的事。

Q2. 单个 16×16×16 的 Cube 执行一条矩阵指令时,同时触发的乘加(MAC)次数是?

单选题 · easy

  • A.256 次
  • B.1024 次
  • C.4096 次← 正确答案
  • D.65536 次

答案:C。16×16×16 = 4096,三个维度同时在阵列里展开,一条指令触发 4096 个乘加器工作。256 是单次送人的操作数,65536 是 16 的 4 次方,都不对。

Q3. 一个 AI Core 内部,除了 Cube 矩阵单元之外,还包含哪些计算单元?

单选题 · mid

  • A.图形渲染与显示单元
  • B.Vector 向量单元与 Scalar 标量单元← 正确答案
  • C.网络通信与路由单元
  • D.视频编解码加速单元

答案:B。AI Core 是“厨房三人组”:Cube 管矩阵乘,Vector 管逐元素运算,Scalar 管流程控制。图形渲染、网络通信、视频编解码都是芯片其他模块的职责,不在 AI Core 的三人组里。

Q4. 关于达芬奇架构的存储层次与数据搬运,下列说法正确的是?

多选题 · mid

  • A.L0 离 Cube 最近,访问延迟最低← 正确答案
  • B.数据搬运开销可能成为性能瓶颈← 正确答案
  • C.乒乓缓冲能隐藏搬运等待时间← 正确答案
  • D.所有数据都必须存放于外部内存

答案:ABC。L0 紧贴 AI Core,延迟最低;搬运时间确实会让有效算力低于峰值;乒乓缓冲通过“算这一块、预取下一块”隐藏等待。D 错误,达芬奇有 L0/L1/L2 三级片上缓冲,不会让所有数据都堆在外部内存。

Q5. 与 GPU 大量小型通用核心相比,达芬奇 Cube 的核心设计思路是?

单选题 · mid

  • A.增加通用核心的数量取胜
  • B.用大矩阵单元降低指令开销← 正确答案
  • C.彻底放弃向量与标量运算
  • D.只靠提升主频来提升算力

答案:B。达芬奇走“大核”路线:一条矩阵指令驱动 4096 次乘加,指令开销被摊薄,矩阵密集负载效率高。GPU 才靠堆小核;Cube 并未放弃向量和标量运算,它们仍作为辅助单元存在。

Q6. 下列哪些 AI 计算场景适合 Cube 单元加速?

多选题 · mid

  • A.卷积神经网络的特征乘加← 正确答案
  • B.全连接层的矩阵乘法← 正确答案
  • C.注意力机制的矩阵相乘← 正确答案
  • D.单个数值的复制操作

答案:ABC。卷积、全连接、注意力本质上都是矩阵乘加,Cube 一勺全接住。单个数值的复制是标量或搬运操作,用 Cube 属于“高射炮打蚊子”,由 Scalar 单元和存储搬运处理更合适。

Q7. 当矩阵乘法的数据搬运时间远大于计算时间时,芯片的有效算力会怎样?

单选题 · hard

  • A.显著低于标称的峰值算力← 正确答案
  • B.始终等于芯片的峰值算力
  • C.超过芯片的理论峰值算力
  • D.与数据搬运完全没有关系

答案:A。有效算力 = 计算量 /(计算时间 + 搬运时间)。搬运时间占大头时,Cube 大部分时间在等数据,有效算力被大幅拉低。就像大厨颠勺再快,食材没备好也只能空等,不可能超过峰值。

Q8. 乒乓缓冲(Ping-Pong)在数据搬运优化中的作用是?

单选题 · easy

  • A.缩小芯片面积降低成本
  • B.让计算与搬运并行交错← 正确答案
  • C.减少片上存储的层次级数
  • D.替代矩阵单元完成运算

答案:B。乒乓缓冲用两个缓冲区轮换:计算单元处理当前数据块时,搬运引擎同时预取下一块,把等待时间“藏”进计算时间里。它不改变存储层次,也不负责运算,纯粹是让搬运和计算并行起来。

Q9. 关于达芬奇架构“单指令多数据”的特性,下列说法正确的是?

多选题 · hard

  • A.一条指令驱动大量乘加单元← 正确答案
  • B.有效降低指令发射与译码开销← 正确答案
  • C.要求数据按矩阵块连续排布← 正确答案
  • D.只支持乘法不支持累加操作

答案:ABC。一条矩阵指令让整块阵列同时工作,指令数量变少,取指译码开销占比降低;为了高效送入数据,输入按 16×16 矩阵块连续排布。D 错误——Cube 的核心动作恰恰是“乘加”,乘和累加是一体的。

Q10. 从设计理念看,达芬奇架构与 GPU 最本质的区别是?

单选题 · mid

  • A.达芬奇没有存储层次结构设计
  • B.GPU 通用灵活,达芬奇聚焦矩阵密集计算← 正确答案
  • C.GPU 完全不支持并行计算
  • D.达芬奇只能用于科学计算

答案:B。GPU 用小而通用的众核应对多种负载,达芬奇用大 Cube 专攻矩阵乘。达芬奇有完整的 L0/L1/L2 存储层次,GPU 也高度并行,达芬奇更是面向 AI 而非科学计算——本质差在“通用 vs 专用”的路线选择。