Page 391 - 《软件学报》2025年第10期
P. 391
4788 软件学报 2025 年第 36 卷第 10 期
[43] Pellauer M, Shao YS, Clemons J, Crago N, Hegde K, Venkatesan R, Keckler SW, Fletcher CW, Emer J. Buffets: An efficient and
composable storage idiom for explicit decoupled data orchestration. In: Proc. of the 24th Int’l Conf. on Architectural Support for
Programming Languages and Operating Systems. Providence: ACM, 2019. 137–151. [doi: 10.1145/3297858.3304025]
[44] Ji Y, Zhang YH, Chen WG, Xie Y. Bridge the gap between neural networks and neuromorphic hardware with a neural network compiler.
In: Proc. of the 23rd Int’l Conf. on Architectural Support for Programming Languages and Operating Systems. Williamsburg: ACM,
2018. 448–460. [doi: 10.1145/3173162.3173205]
[45] Feng SY, Hou BH, Jin HY, Lin WW, Shao JR, Lai RH, Ye ZH, Zheng LM, Yu CH, Yu Y, Chen TQ. TensorIR: An abstraction for
automatic tensorized program optimization. In: Proc. of the 28th ACM Int’l Conf. on Architectural Support for Programming Languages
and Operating Systems. Vancouver: ACM, 2023. 804–817. [doi: 10.1145/3575693.3576933]
附录 A. SNN、ReRAM 与 GaBAN 方言
BIVM 所设计的 SNN、ReRAM 与 GaBAN 方言中, 各类原语的形式化描述请见表 A1–表 A3; 表中给出了各
类操作/数据类型/属性的名称、语义层面的形式化描述、文字解释, 以及运行时数据格式层面的形式化描述.
表 A1 SNN 方言中的操作、数据类型与属性
名称 语义层面的形式描述 含义 数据格式层面的形式化描述
(i32, f32, f32, f32, f32, f32, i1) ->
根据输入的Lif 初始状态, 生成并初始化一组 LIF神 (memref<?xf32>, memref<?xf32>,
snn.newlif Lif -> Lif[N]
经元 memref<?xf32>, memref<?xf32>,
spike_tensor<?xi1>, memref<?xf32>)
Weight[N][N] -> (i32, i32, memref<?xf32>) ->
snn.newstatic 根据权重矩阵生成一组静态突触
StaticSynapse tensor<?x?xf32>
(i32, f32, f32, i1) -> (memref<?xf32>,
Izhikevich -> 根据输入的Izhikevich 初始状态, 生成并初始化一
snn.newizhikevich memref<?xf32>, spike_tensor<?xi1>,
Izhikevich[N] 组 Izhikevich神经元
memref<?xf32>)
snn.newpoisson () -> Poisson[N] 生成并初始化一组Poisson神经元 () -> memref<?xi32>
(memref<?xf32>, memref<?xf32>,
(Weight[N], Lif[N])
snn.lif 根据输入脉冲的权重对一组LIF神经元进行更新 memref<?xf32>, memref<?xf32>,
-> Spike[N]
spike_tensor<?xi1>, memref<?xf32>)
(Spike[N],
根据前序神经元产生的脉冲, 执行静态突触脉冲发 (spike_tensor<?xi1>, tensor<?x?xf32>,
snn.static StaticSynapse) -> 放, 计算得到后继神经元的脉冲权重输入 memref<?xf32>)
Weight[N]
(Weight[N], 根据输入脉冲的权重对一组Izhikevich神经元进行 (memref<?xf32>, memref<?xf32>,
snn.izhikevich Izhikevich[N]) -> 更新 spike_tensor<?xi1>, memref<?xf32>,
Spike[N] f32, f32, f32, f32, f32, f32)
(Probability[N],
snn.poisson Poisson[N]) -> 根据输入的概率参数, 由 Poisson 神经元产生脉冲 (memref<?xi32>, spike_tensor<?xi1>,
memref<?xi32>)
Spike[N]
spike_tensor - 脉冲张量类型, 表示一列神经元发放的脉冲 { tensor<type, #SparseEncoding> }
sparse_tensor - 稀疏矩阵格式, 表示稀疏矩阵的逻辑下标和存储位 这一属性复用了MLIR中sparse_tensor
encoding 置之间的映射关系 方言的encoding属性
表 A2 ReRAM 方言中的操作、数据类型与属性
名称 语义层面的形式描述 含义 数据格式层面的形式化描述
rram.init_crossbar Weight[N][N] -> Crossbar 使用权值初始化硬件交叉开关, 并得到一个 Crossbar 实例 memref<?xf32> -> Crossbar
(Spike[N], Crossbar) -> 根据前序神经元产生的脉冲, 使用 Crossbar 实例计算得 (spike_tensor<?xi1>,
rram.run_crossbar
Weight[N] 到后继神经元的脉冲权重输入 Crossbar, memref<?xf32>)
交叉开关类型, 表示一个已经初始化完成, 可以使用的
Crossbar - 无运行时存储
ReRAM交叉开关

