想象你是一座大型智慧仓库的分拣员。仓库里有一面巨大的“货架墙”,上面有两百个格子,但每天只有二十几个格子真正放着包裹——其他格子全是空的。有两种工作方式:普通分拣员从第一个格子走到最后一个格子,逐个打开检查,两百步走完,累得够呛;聪明的分拣员则会先看一眼墙边的“包裹登记表”,上面清清楚楚写着哪几号格子有包裹,他直接走过去取件,二十几步轻松搞定。稀疏计算就像这张登记表:数据里绝大多数值是“零”(空货架),算法只盯住那些非零的“包裹”(有效信息)进行计算,跳过所有空位。在神经形态计算这类“事件驱动”系统中,信息本身就像零星的快递一样,只在有动静时才出现,稀疏计算因此成了压降计算量、提升速度的关键武器。

岗位关联

掌握稀疏计算,等于握住了大模型推理和神经形态芯片性能优化的核心杠杆,是 AI 工程落地的“省电术”。

目录
  1. 可视化演示
  2. 稀疏本质——货架墙的真相
  3. 数据结构——包裹登记表
  4. 跳零计算——跳过空货架
  5. 稀疏卷积——分拣台上的局部协作
  6. 能效收益——计步器上的数字
  7. 硬件支持——智能设备入场
  8. 工程差距——登记表的代价
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示稀疏计算核心技术:事件数据COO稀疏存储、跳零计算条件判断优化、稀疏卷积活跃像素索引及理论实际加速比对比,含硬件架构支持分析,附六边网格背景动画。

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

稀疏本质——货架墙的真相

小陈第一天到智慧仓库上班,班长指着货架墙说:“这面墙有 200 个格子,记住,大多数是空的,每天只有二十几个格子有包裹。”小陈很惊讶:“那为什么不直接在登记表上标出来?”班长笑了:“这就是你接下来要学的东西。”

在计算机的世界里,这种“大部分格子是空的”的数据比比皆是。一张图像经过事件相机处理后,只有像素亮度变化的那些点才被记录,绝大多数区域“静默无声”;一个用户在上亿件商品中的点击记录,可能只有几百条非零。这种“大多数元素为 0,只有少量元素非零”的数据结构,我们称之为稀疏数据。

稀疏性用稀疏率 ρ 来刻画,即非零元素占总数的比例。事件驱动系统天然产生稀疏数据:从神经形态芯片(如 Intel Loihi)输出的脉冲事件流,在任意时刻都只有少量神经元在发放脉冲,其余大部分神经元处于“安静”状态。

小陈明白了:一眼看穿“哪些格子空着”,就能把精力花在刀刃上。稀疏率就是分拣员对仓库“空置率”的直觉判断——越空,越值得用巧劲。

ρ=NnzNtotal=NnzNnz+Nzero\displaystyle \rho = \frac{N_{nz}}{N_{total}} = \frac{N_{nz}}{N_{nz} + N_{zero}}
稀疏率衡量的是“货架墙上真正放着包裹的格子占比”,ρ 越小,数据越稀疏,可以省下的功夫越多。
  1. N_nz(非零元素数)货架上放着包裹的格子数量——这是唯一需要关注的数据。
    NnzN_{nz}
  2. N_zero(零元素数)空空如也、没有包裹的格子数量——它们占绝大多数。
    NzeroN_{zero}
  3. N_total(总元素数)货架墙的格子总数,等于有包裹与没包裹的格子数之和。
    Ntotal=Nnz+NzeroN_{total} = N_{nz} + N_{zero}
  4. ρ(稀疏率)用非零元素数除以总数,得到“有包裹格子”的占比,ρ 越小越稀疏。
    ρ=NnzNtotal\rho = \dfrac{N_{nz}}{N_{total}}

数据结构——包裹登记表

第二天,班长递给小陈一张卡片:“这是包裹登记表,只记有包裹的格号。”小陈一看,表格上写着:12 号格-洗发水、35 号格-手机壳、98 号格-螺丝刀……“就这二十几行?”“对,因为只有这些地方有东西。”

计算机存储稀疏数据也一样。最朴素的方式是“稠密存储”——像货架墙本身一样,为每一个格子分配一块内存,即使它是空的。对于 200 格的小墙没问题,但如果是十亿格的大仓库(比如百万维的特征向量),为每个空格子都留位置就太浪费了。于是人们设计出“稀疏存储”:只保存“哪个格子有包裹,包裹是什么”。

最直观的稀疏格式是 COO(坐标列表),用三个数组分别记录非零元素的行号、列号和值,每个非零元素占三个数字。更紧凑的是 CSR(压缩稀疏行),把同一行的非零元素“压”在一起,用一个行指针数组记录每行从第几个元素开始,省掉了行号数组。CSR 的存储量可以估算为:

小陈把登记表揣进口袋,心里踏实了:有了它,他不需要围着整面墙转圈,只需要按表索骥。稀疏数据结构就是这张表,它改变了“遍历”的含义。

MCSR=2×Nnz+R+1\displaystyle M_{CSR} = 2 \times N_{nz} + R + 1
CSR 让登记表更薄:每行只需记一个“起点”,不必为每个包裹重复写行号。
  1. 2 × N_nz(值和列号)每个非零包裹要记两笔——装在哪个格子(列号)和里面是什么(值)。
    2×Nnz2 \times N_{nz}
  2. R(行指针)R 行货架,每行记一个起始位置,说明这一行的第一个包裹在登记表里从第几行开始。
    RR
  3. +1(终止标记)最后再补一个越界值,标记“表到此结束”,方便程序遍历时判断边界。
    +1+1

跳零计算——跳过空货架

小陈开始按登记表取件。走到 12 号格,取;走到 35 号格,取;中途经过 13 号、14 号……那些空格子,他连停都不停。班长在监控里看到,直点头:“对,空格子看都不用看,看就是浪费时间。”

在算法里,“空格子”就是零值。稠密计算的做法是:对每一个元素都执行“读取 → 乘 → 加”完整流水线,即使乘的是 0——白白消耗计算资源。跳零计算则在执行前加一个“哨兵”:检查当前元素是否为 0,如果是,直接跳过这次无效的乘加运算。

跳零带来的计算量缩减可以直接用稀疏率表达。设稠密计算需要 C_dense 次有效操作,跳零后只需:

取件路上,小陈心里算了一笔账:200 个格子只走 24 格,工作少了 88%。“跳零”不是魔术,就是聪明地绕开那些“看了也白看”的空位置。

Csparse=ρ×Cdense\displaystyle C_{sparse} = \rho \times C_{dense}
计算量从“全货架扫描”降为“有包裹的格子数量”,节省了 (1−ρ) 比例的操作。
  1. C_dense(稠密计算量)逐格检查整面墙需要做的全部乘加次数,是稀疏方案的对比基准。
    CdenseC_{dense}
  2. ρ(稀疏率)只有 ρ 比例的元素是非零的,才值得真正去做乘加。
    ρ\rho
  3. C_sparse(稀疏计算量)两者相乘,得到跳零后实际执行的计算量——只算有包裹的格子。
    Csparse=ρ×CdenseC_{sparse} = \rho \times C_{dense}

稀疏卷积——分拣台上的局部协作

仓库深处有一张分拣台,每来一个包裹,小陈要快速看一眼它周围 9 个格子里有没有“邻居包裹”(比如手机壳要配充电线)。普通做法是每次把 9 个格子的状态全部检查一遍,哪怕 8 个格子是空的;小陈有了登记表后,直接查“这个包裹周围的格子里,有几个也在登记表上”,只对有包裹的邻居动手。

这就是稀疏卷积的思想。标准卷积用 K×K 的滑动窗口在全图上做乘加,每个输出点都要计算 K² 次乘法。但当输入特征图是稀疏的时,窗口内很多位置是零,这些位置的乘法结果恒为零,纯属浪费。稀疏卷积通过掩码或索引,只对窗口内的非零位置执行卷积运算。

小陈发现,有了登记表,分拣台的活儿也轻松了——他不再对着空格子比划,而是直接锁定有货的邻居。稀疏卷积,就是把“例行检查”变成“按图索骥”。

Cconv=ρ×K2×Hout×Wout\displaystyle C_{conv} = \rho \times K^2 \times H_{out} \times W_{out}
卷积总计算量 = 稀疏率 × 每个窗口的乘加数 × 输出点数,稀疏度直接转化为乘法次数的削减。
  1. K²(窗口范围)分拣台检查的 3×3 = 9 个邻居格子数,即卷积核大小。
    K2K^2
  2. H_out × W_out(输出规模)分拣台需要移动覆盖的网格大小,即输出特征图的尺寸。
    Hout×WoutH_{out} \times W_{out}
  3. ρ(窗口内非零比例)每个窗口里真正有包裹的邻居占比,决定了一次窗口运算中有多少乘加值得做。
    ρ\rho
  4. C_conv(稀疏卷积量)三部分相乘,得到执行稀疏卷积需要的实际乘加次数。
    Cconv=ρ×K2×Hout×WoutC_{conv} = \rho \times K^2 \times H_{out} \times W_{out}

能效收益——计步器上的数字

下班时,小陈看了看计步器:12000 步。同事走的是“逐格检查”路线,计步器上是 98000 步。“我少走了 86% 的路,省下了鞋底,也省下了时间。”小陈得意地说。这份“省”,就是稀疏计算带来的能效收益。

在 AI 推理中,“步数”对应的是乘加运算(MAC)次数和访存次数,而“鞋底磨损”对应的是芯片功耗。芯片的动态功耗与翻转的晶体管数量成正比——减少计算次数,就是直接减少晶体管翻转,功耗近似线性下降。

如果只考虑计算部分,稀疏方案的理想加速比为:

小陈的计步器告诉所有人:最省力的路线,不是走得更快,而是绕开没有包裹的路。能效收益,就是这条“不走路”路线的直接回报——省时间、省电、省带宽。

Speedup=CdenseCsparse≈1ρ\displaystyle \text{Speedup} = \frac{C_{dense}}{C_{sparse}} \approx \frac{1}{\rho}
稀疏率 0.1 时理想加速 10 倍;稀疏率 0.01 时理想加速 100 倍,这是数量级的收益。
  1. C_dense / C_sparse(计算量之比)笨办法的步数除以巧办法的步数,两者相差多少倍就是加速多少倍。
    CdenseCsparse\frac{C_{dense}}{C_{sparse}}
  2. 1/ρ(稀疏率倒数)把 C_sparse = ρ × C_dense 代进去,比值约等于 ρ 的倒数,稀疏率越低收益越夸张。
    1ρ\frac{1}{\rho}

硬件支持——智能设备入场

仓库升级了:给分拣员配了电动滑轨车和扫码手套。滑轨车把分拣员送到有包裹的格子旁,手套一扫就知道是什么货。但班长强调:“滑轨车的导航系统是灵魂,它必须知道下一个包裹在哪——否则车只会傻跑。”这个“导航系统”,对应硬件里的索引解析单元。

通用 CPU/GPU 是为稠密计算设计的:它们假设数据是连续、密集的,通过流水线和 SIMD 批量处理。遇到稀疏数据时,它们会因分支判断而管线停顿,因非连续访存而缓存失效。要在硬件层面真正吃满稀疏性,需要专门的架构支持。

专用稀疏加速器(如 Eyeriss、稀疏张量核)会增加三类关键单元:索引解析单元(解码稀疏格式,生成非零元素地址流)、跳过逻辑(识别零值并阻止其进入乘加阵列)、压缩数据通路(按有效数据重新编排访存)。其能耗模型可以近似为:

小陈的新装备让“按表索骥”如虎添翼:滑轨车(专用数据通路)负责快速移动,手套(索引解析单元)负责识别包裹。硬件的意义,就是让聪明的算法跑得更顺,不被“绕路”卡住。

Esparse=ρ×Edensecompute+Eindex\displaystyle E_{sparse} = \rho \times E_{dense}^{compute} + E_{index}
计算能耗随稀疏率下降,但索引解析会带来一笔固定开销,硬件设计的核心就是把这笔开销压到最低。
  1. ρ × E_dense(有效计算能耗)只有 ρ 比例的计算真正执行,能耗跟着打折。
    ρ×Edensecompute\rho \times E_{dense}^{compute}
  2. E_index(索引开销)解析登记表、定位包裹格子的能耗,它不随稀疏率缩小。
    EindexE_{index}
  3. E_sparse(稀疏总能耗)两部分相加,就是稀疏方案在实际硬件上跑出的能耗账单。
    Esparse=ρ×Edensecompute+EindexE_{sparse} = \rho \times E_{dense}^{compute} + E_{index}

工程差距——登记表的代价

用了几天登记表后,小陈发现一个坑:有一天包裹特别多——150 格都有货。他虽然不用看空位,但每个包裹都要去翻登记表、核格号、再取件,反而比直接逐格扫描多了一道工序。“登记表本身也要维护,不是白来的。”

这正是理论稀疏加速和工程现实的差距。索引解析、分支判断、非连续访存、数据重排……这些“维护登记表”的开销,在计算量中是无法忽略的常数项 ε。当稀疏率 ρ 很低时,1/ρ 的收益远大于 ε,稀疏方案大赚;当 ρ 较高(比如 0.4 以上),收益被 ε 蚕食,甚至可能倒挂。

引入开销项 ε 后,实际加速比为:

小陈在周会上分享心得:“登记表是神器,但别盲目用。包裹少时它帮你省力,包裹多时它就是累赘。聪明的分拣员要懂得在合适的时候用合适的工具。”稀疏计算的工程化,同样需要这份“因地制宜”的智慧。

Speedupreal=CdenseCsparse+Coverhead≈1ρ+ε\displaystyle \text{Speedup}_{real} = \frac{C_{dense}}{C_{sparse} + C_{overhead}} \approx \frac{1}{\rho + \varepsilon}
只有当 ρ 和 ε 之和明显小于 1 时,稀疏加速才真正值得;软硬件协同的目标就是不断压低 ε。
  1. C_overhead(实际开销)登记表的维护费——索引解析、分支判断、不连续访存带来的额外代价。
    CoverheadC_{overhead}
  2. ρ + ε(有效系数)稀疏率与开销率叠加,代表实际执行中“逃不掉的计算占比”。
    ρ+ε\rho + \varepsilon
  3. 1/(ρ+ε)(实际加速比)理论值 1/ρ 打了折扣,这才是工程中能拿到的真实收益。
    1ρ+ε\frac{1}{\rho + \varepsilon}

AI 应用场景

场景1:自动驾驶事件相机的实时路况感知

阶段:模型推理(感知前端)

解决的问题:传统帧相机每秒输出 30 帧稠密图像,稠密卷积处理每帧需几十亿次乘加,在嵌入式平台上延迟高、功耗大。事件相机只在像素亮度变化时输出事件(如车辆驶过、行人移动),事件流天然稀疏,用稀疏卷积只处理“有动静”的区域,计算量可降一个数量级。

具体案例:某自动驾驶公司的感知系统采用事件相机 + 稀疏卷积网络,在边缘计算平台上将障碍物检测延迟从 80ms 降到 12ms,功耗仅为原来的 1/5,保障了高速场景下紧急制动的响应时间。

场景2:大语言模型的稀疏化推理

阶段:模型压缩与部署

解决的问题:LLM 动辄百亿参数,推理时每个 Token 都要做全参数量级的矩阵乘法,GPU 显存和算力都吃紧。剪枝后大量权重为 0,稀疏推理跳过零值,只计算保留下来的重要连接,让“聪明分拣只跑有货路线”的思想在矩阵乘法里落地。

具体案例:某大模型推理团队将 70B 模型按 30% 稀疏率剪枝,配合稀疏矩阵乘内核,在 A100 上让单 Token 生成延迟降低约 2.8 倍,显存占用下降 40%,在成本预算不变的情况下将并发服务能力翻倍。

场景3:推荐系统稀疏特征下的 CTR 预估

阶段:特征工程与模型训练

解决的问题:用户行为特征(点击序列、兴趣标签)是典型的高维稀疏数据,上亿维特征中每个样本只有几百个非零维。用稠密表示会导致内存爆炸,用稀疏存储 + 稀疏查找可将嵌入表缩小 90% 以上。

具体案例:某电商平台的 CTR 模型将用户历史行为编码为稀疏 ID 序列,通过稀疏嵌入查找(只取非零 ID 对应的向量)和稀疏特征交叉,在保证 AUC 不降的前提下,将训练时间从 12 小时压缩到 3 小时,线上推理 P99 延迟降低 65%。

Python 演示

python66 行
import randomimport time  class SparseVector:    """稀疏向量:只保存非零元素,索引到值的映射"""     def __init__(self, dim):        self.dim = dim        self.data = {}     def set(self, idx, val):        if val != 0:            self.data[idx] = val        elif idx in self.data:            del self.data[idx]     @property    def nnz(self):        return len(self.data)     def dot_dense(self, other):        """稠密版点积:遍历全维度,逐维相乘相加"""        total = 0        for i in range(self.dim):            total += self.data.get(i, 0) * other.data.get(i, 0)        return total     def dot_sparse(self, other):        """稀疏版点积:只遍历非零索引并求交集"""        total = 0        if len(self.data) <= len(other.data):            small, large = self.data, other.data        else:            small, large = other.data, self.data        for idx in small:            if idx in large:                total += small[idx] * large[idx]        return total  def main():    dim = 1000000    a = SparseVector(dim)    b = SparseVector(dim)    random.seed(42)    for _ in range(80):        a.set(random.randint(0, dim - 1), random.random())        b.set(random.randint(0, dim - 1), random.random())     t0 = time.time()    r_dense = a.dot_dense(b)    t1 = time.time()    r_sparse = a.dot_sparse(b)    t2 = time.time()     print("向量维度: {}".format(dim))    print("非零元素数: a={}, b={}".format(a.nnz, b.nnz))    print("稠密点积: {:.6f}, 耗时 {:.3f} 秒".format(r_dense, t1 - t0))    print("稀疏点积: {:.6f}, 耗时 {:.3f} 秒".format(r_sparse, t2 - t1))    print("稀疏加速: {:.0f} 倍".format((t1 - t0) / (t2 - t1)))    assert abs(r_dense - r_sparse) < 1e-9, "结果不一致"  if __name__ == "__main__":    main()
目的:构造两个 100 万维的稀疏向量(各约 80 个非零元素),分别用稠密遍历和稀疏跳零两种方式计算点积,直观对比计算耗时,展示“跳过空货架”带来的数量级加速。
  1. self.data = {}用字典存储“索引→值”映射,只记非零元素,这是稀疏数据结构的核心。
  2. if val != 0:set 方法拒绝存零值,保证向量始终稀疏,不让空位混进来。
  3. for i in range(self.dim):稠密点积要遍历 100 万维,即使绝大多数维度是空货架。
  4. self.data.get(i, 0)查索引 i 的值,查不到就按 0 处理,这行是稠密版的关键回退。
  5. if len(self.data) <= len(other.data):稀疏版先挑更短的非零字典遍历,进一步缩小搜索空间。
  6. if idx in large:只有两个向量都非零的维度才做乘法,这就是跳零思想的代码化身。

常见误区

误区“稀疏计算不就是把矩阵里的 0 不存吗?省点内存而已,计算速度没啥变化。”初学者看到 CSR 格式时,往往把稀疏性理解成一个存储优化技巧。

正解存储压缩只是表面功夫。稀疏计算的核心价值在计算侧:跳零机制让处理器跳过与零值相关的乘加运算,把“存储上的省”转化为“计算量上的省”。如果一个稀疏格式只省内存但计算时仍然遍历所有元素(稠密循环 + 读 0),速度不会提升。真正要设计的是“怎么知道哪里非零、只去哪里的计算路径”。

为何常见:CSR/COO 这类格式的视觉第一印象就是“文件变小了”,而计算路径是抽象的、看不见的,初学者自然把稀疏性与压缩存储划等号。

误区“ρ=0.01 肯定比 ρ=0.1 快 10 倍,稀疏率越低越好!”把加速比公式当作铁律,忽略了索引开销。

正解加速比是 1/(ρ+ε) 而非 1/ρ。当 ρ 已经很低时,ε(索引解析、分支判断、缓存缺失)成为瓶颈,继续降 ρ 收益有限;当 ρ 较高时,稀疏方案可能比稠密方案还慢。业界通常认为 ρ > 0.3~0.5 时稠密更优,且这个阈值因硬件而异。

为何常见:理论公式 1/ρ 太简洁太优美,让人容易忽略公式成立的前提——“零开销的索引”在现实中并不存在。

误区“跳零只是跳过 0,0 乘任何数都是 0,所以结果肯定一模一样,没有任何精度损失。”

正解数学上等价,工程上有差异。浮点数运算是非结合的,(a+b)+c 与 a+(b+c) 可能有微小舍入差。稀疏卷积改变了运算顺序(先跳过 0,再对非零按新顺序求和),输出与稠密卷积可能有约 1e-6 量级的差异。另外,很多稀疏卷积来自剪枝——把接近 0 但非 0 的权重视为 0,这本身就有精度损失。

为何常见:“0 加任何数等于任何数”是数学直觉,但浮点舍入和近似剪枝这两个工程细节,打破了这一直觉。

误区“给 CPU 写个 if 判断,遇到 0 就跳过,稀疏就搞定了,不需要专门硬件。”

正解CPU 的分支预测在稀疏数据上频繁失效,GPU 的 SIMD 线程遇到跳零会发散(一个线程在算、旁边线程在空转),性能大打折扣。真正的稀疏加速器在硬件层面提供索引解析单元、零值跳过数据通路和压缩存储接口,让跳零成为流水线内建动作而非异常分支。

为何常见:软件工程师接触最多的就是 if (x != 0),容易以为加个条件是零成本的;实际上处理器架构对分支的惩罚和 SIMD 的同步约束,让朴素跳零逻辑在真实硬件上跑不出理想加速。

误区“COO/CSR 把矩阵压缩了,肯定比二维数组小,用稀疏结构准没错。”

正解当稀疏率较高时,索引本身成了大头。一个 float(4 字节)的非零值要配一个 int(4 字节)的列号,CSR 还要每行一个指针。粗算一下:ρ=0.5 时 CSR 存储 ≈ 2×0.5×4×N_total + 行指针 ≈ N_total×4 + 行指针,刚好超过稠密数组。所以稀疏格式只在 ρ 足够低时省内存,工程上大约 ρ < 0.3 时才有明显优势。

为何常见:教材里总是拿高度稀疏的示例矩阵做对比(ρ=0.01),产生了“稀疏 = 省内存”的思维定势,忽略了格式本身的元数据成本。

面试题

Q1. 稀疏率 ρ=0.1 表示什么?

单选题 · easy

  • A.10%的元素是非零的← 正确答案
  • B.10%的元素是零
  • C.90%的元素是非零的
  • D.推理速度提升10倍

答案:A。ρ = N_nz / N_total,即非零元素占总数的比例。ρ=0.1 表示只有 10% 的元素非零,90% 是零。B 把比例说反了,C 把 10% 说成了 90%,D 混淆了稀疏率与加速比。

Q2. 在稀疏矩阵存储中,以下哪种结构最适合表示高度稀疏的数据?

单选题 · easy

  • A.普通的稠密二维数组
  • B.坐标列表COO格式← 正确答案
  • C.先进先出的队列
  • D.二叉决策树结构

答案:B。COO 用三个数组分别记录非零元素的行、列、值,是标准稀疏格式。稠密二维数组对高度稀疏数据浪费严重;队列和决策树不是矩阵存储格式。选 B。

Q3. CSR(压缩稀疏行)格式中,行指针数组的主要作用是?

单选题 · mid

  • A.记录每行非零元素起始位置← 正确答案
  • B.存储所有非零元素的具体值
  • C.记录矩阵的行数和列数
  • D.标记零元素的坐标位置

答案:A。CSR 用 values 存非零值、columns 存列号、row_ptr 存每行起始索引。row_ptr[i] 告诉第 i 行的第一个非零元素在 values 数组中的下标。C 描述的矩阵维度信息由外部参数保存,D 与稀疏格式记录非零元素的理念相反。选 A。

Q4. 相比于稠密卷积,稀疏卷积在以下哪些方面有提升?

多选题 · mid

  • A.乘加计算量显著减少← 正确答案
  • B.内存带宽消耗降低← 正确答案
  • C.模型精度必然提高
  • D.推理延迟有望下降← 正确答案

答案:ABD。跳零减少乘加运算(A 对),只访存非零数据降低带宽(B 对),计算并行度和访存效率提升使延迟下降(D 对)。精度与稀疏化方式有关,稀疏卷积本身不保证精度提高(C 错)。

Q5. 跳零计算中“跳零”的核心操作是什么?

单选题 · mid

  • A.将零值替换为非零值
  • B.判断为零并跳过乘加← 正确答案
  • C.删除所有非零元素
  • D.转成稠密存储格式

答案:B。跳零的核心是“先判断再决定是否计算”:若数据为 0,则跳过该数据的乘法累加,这是稀疏计算降低计算量的直接手段。A 是错误操作,C 是清空数据,D 与稀疏化背道而驰。选 B。

Q6. 某稀疏矩阵 ρ=0.01,仅考虑计算量时理想加速比约为?

单选题 · hard

  • A.提升10倍左右
  • B.提升100倍左右← 正确答案
  • C.几乎没有任何提升
  • D.反而降低100倍

答案:B。理想加速比 ≈ 1/ρ = 1/0.01 = 100。这是不考虑索引开销、访存开销的理论上限,实际会小于 100 但数量级在百倍附近。选 B。

Q7. 实际工程中稀疏加速比达不到理论值 1/ρ,主要原因是?

多选题 · hard

  • A.索引解析有额外开销← 正确答案
  • B.分支判断带来控制开销← 正确答案
  • C.非连续访存降低缓存命中← 正确答案
  • D.零值也必须参与全部计算

答案:ABC。索引解析(A)、分支判断(B)、访存随机性(C)都是稀疏化的真实代价,它们构成公式中的 ε 项。D 是错误陈述——跳零的目的就是让零值不参与计算。

Q8. 神经形态芯片(如 Intel Loihi)输出的事件流具有什么特点?

单选题 · easy

  • A.密集且实时连续输出
  • B.稀疏且零星分散到达← 正确答案
  • C.每秒固定数量脉冲
  • D.只包含位置不包含时间

答案:B。神经形态芯片模拟生物神经元“有事件才发放”的机制,事件流在时间和空间上都是稀疏的。A/C 是稠密帧或固定速率的描述,D 错误,事件流通常包含时间戳信息。选 B。

Q9. 专用稀疏加速器相比通用 CPU/GPU,最关键的增加是?

单选题 · mid

  • A.更大容量的数据缓存
  • B.索引解析与跳过逻辑← 正确答案
  • C.更多并行乘加单元
  • D.更高频率的CPU核心

答案:B。CPU/GPU 的瓶颈在于无法高效处理分支和非连续访存,稀疏加速器在硬件中内建索引解析与零值跳过逻辑,让“找非零并计算”变成流水线内建行为。A/C/D 都是增量优化,不是关键差异。选 B。

Q10. 关于稀疏计算的工程实现,以下说法正确的是?

多选题 · mid

  • A.软硬件协同设计可缩小差距← 正确答案
  • B.稀疏率较高应选稠密方案← 正确答案
  • C.索引开销任何情况下可忽略
  • D.数据重排提升访存局部性← 正确答案

答案:ABD。软件(格式选择、计算调度)与硬件(跳过逻辑)协同可压低 ε 项(A 对);ρ 高时稀疏方案得不偿失,应选稠密(B 对);按非零元素聚集度重排数据可提高缓存命中(D 对)。C 过于绝对,索引开销正是理论加速与实际差距的主要来源之一。