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交叉开关
   386   387   388   389   390   391   392   393   394   395   396