NVDLA专题8:具体模块介绍——Convolution Accumulator

概述

卷积累加器(Convolution Accumulator, CACC)是CMAC之后的卷积流水线的一个阶段,CACC的定义在NV_NVDLA_cacc.v,module定义如下:

module NV_NVDLA_cacc (
   cacc2sdp_ready                //|< i
  ,csb2cacc_req_pd               //|< i
  ,csb2cacc_req_pvld             //|< i
  ,dla_clk_ovr_on_sync           //|< i
  ,global_clk_ovr_on_sync        //|< i
  ,mac_a2accu_data0              //|< i
  ,mac_a2accu_data1              //|< i
  ,mac_a2accu_data2              //|< i
  ,mac_a2accu_data3              //|< i
  ,mac_a2accu_data4              //|< i
  ,mac_a2accu_data5              //|< i
  ,mac_a2accu_data6              //|< i
  ,mac_a2accu_data7              //|< i
  ,mac_a2accu_mask               //|< i
  ,mac_a2accu_mode               //|< i
  ,mac_a2accu_pd                 //|< i
  ,mac_a2accu_pvld               //|< i
  ,mac_b2accu_data0              //|< i
  ,mac_b2accu_data1              //|< i
  ,mac_b2accu_data2              //|< i
  ,mac_b2accu_data3              //|< i
  ,mac_b2accu_data4              //|< i
  ,mac_b2accu_data5              //|< i
  ,mac_b2accu_data6              //|< i
  ,mac_b2accu_data7              //|< i
  ,mac_b2accu_mask               //|< i
  ,mac_b2accu_mode               //|< i
  ,mac_b2accu_pd                 //|< i
  ,mac_b2accu_pvld               //|< i
  ,nvdla_core_clk                //|< i
  ,nvdla_core_rstn               //|< i
  ,pwrbus_ram_pd                 //|< i
  ,tmc2slcg_disable_clock_gating //|< i
  ,accu2sc_credit_size           //|> o
  ,accu2sc_credit_vld            //|> o
  ,cacc2csb_resp_pd              //|> o
  ,cacc2csb_resp_valid           //|> o
  ,cacc2glb_done_intr_pd         //|> o
  ,cacc2sdp_pd                   //|> o
  ,cacc2sdp_valid                //|> o
  ,csb2cacc_req_prdy             //|> o
  );

//
// NV_NVDLA_cacc_ports.v
//
input  nvdla_core_clk;   /* csb2cacc_req, cacc2csb_resp, mac_a2accu, mac_b2accu, cacc2sdp, accu2sc_credit, cacc2glb_done_intr */
input  nvdla_core_rstn;  /* csb2cacc_req, cacc2csb_resp, mac_a2accu, mac_b2accu, cacc2sdp, accu2sc_credit, cacc2glb_done_intr */

input [31:0] pwrbus_ram_pd;

input         csb2cacc_req_pvld;  /* data valid */
output        csb2cacc_req_prdy;  /* data return handshake */
input  [62:0] csb2cacc_req_pd;

output        cacc2csb_resp_valid;  /* data valid */
output [33:0] cacc2csb_resp_pd;     /* pkt_id_width=1 pkt_widths=33,33  */

input         mac_a2accu_pvld;   /* data valid */
input   [7:0] mac_a2accu_mask;
input   [7:0] mac_a2accu_mode;
input [175:0] mac_a2accu_data0;
input [175:0] mac_a2accu_data1;
input [175:0] mac_a2accu_data2;
input [175:0] mac_a2accu_data3;
input [175:0] mac_a2accu_data4;
input [175:0] mac_a2accu_data5;
input [175:0] mac_a2accu_data6;
input [175:0] mac_a2accu_data7;
input   [8:0] mac_a2accu_pd;

input         mac_b2accu_pvld;   /* data valid */
input   [7:0] mac_b2accu_mask;
input   [7:0] mac_b2accu_mode;
input [175:0] mac_b2accu_data0;
input [175:0] mac_b2accu_data1;
input [175:0] mac_b2accu_data2;
input [175:0] mac_b2accu_data3;
input [175:0] mac_b2accu_data4;
input [175:0] mac_b2accu_data5;
input [175:0] mac_b2accu_data6;
input [175:0] mac_b2accu_data7;
input   [8:0] mac_b2accu_pd;

output         cacc2sdp_valid;  /* data valid */
input          cacc2sdp_ready;  /* data return handshake */
output [513:0] cacc2sdp_pd;

output       accu2sc_credit_vld;   /* data valid */
output [2:0] accu2sc_credit_size;

output [1:0] cacc2glb_done_intr_pd;

//Port for SLCG
input   dla_clk_ovr_on_sync;
input   global_clk_ovr_on_sync;
input   tmc2slcg_disable_clock_gating;

它用于累加卷积MAC的部分和,并在发送到SDP之前对结果进行round/saturate操作。此外,卷积累加器中的大缓冲器可以平滑卷积流水线的峰值吞吐量。

CACC累加器的最终结果是INT16为48位,INT8为34位,CACC和SDP之间的位宽是32(多个相加,需要考虑溢出的情况,因此设置较高位数,之后等价转换到指定有效位数)。对于精度INT8和INT16,在将结果发送到SDP之前,有一个round/saturate操作。round操作精度由寄存器D_CLIP_CFG中的域CLIP_TRUNCATE配置。对于FP16,该值只是从FP48转换为FP32。

CACC中的部件包括assembly SRAM组、传送(delivery)SRAM组、加法器阵列、截断阵列、valid-credit控制器和检验器。

以下是CACC的工作流程:

  1. 从assembly SRAM组预取累加和。
  2. 当部分和到达时,将它们与累积和一起发送到加法器阵列,如果部分和来自第一个stripe操作,则累计和应为0。
  3. 从加法器阵列的输出端收集新的累加和。
  4. 存储到assembly SRAM组中。
  5. 根据stripe操作重复步骤1~步骤3,直到完成一个通道操作。
  6. 如果通道操作完成,对加法器的输出进行round/saturate操作。
  7. 收集上一步的结果,并将它们存储到传送SRAM组中。
  8. 从传送缓冲区组加载结果并将其发送到SDP。

assembly SRAM组包含4个96Bx32 SRAMs和4个64Bx32 SRAMs,缓冲区组用于缓存高精度的累加和,对于直接卷积,assembly SRAM组充当int16/fp16的一个96Bx128缓冲器或int8的一个136Bx128缓冲器。对于Winograd卷积,assembly SRAM充当int16/fp16的384Bx32缓冲器或int8的544Bx32缓冲器。assembly组的读-存储循环至少需要11个周期。

传送SRAM组包含8个64Bx32 SRAMs,缓冲区组用于缓存要传递给SDP的结果。每个周期的输入从16个元素到128个元素不等,而输出总是每个周期16个元素。

累加和的精度如下

在加法器阵列中,有64个INT48加法器、64个INT34加法器和64个FP48加法器,它们中的一部分以不同的模式被激活

为了支持DC模式下的多批次(multi-batch)选项,CACC在传送SRAM组中应用了数据重新映射功能。这意味着当启用多批次时,传送SRAM组中的数据顺序可能与assembly SRAM组中的顺序不匹配。如果在SDP中进一步计算后,原子立方体将在相同的64字节包中,则交付SRAM的写控制器将组合原子立方体。当启用多批处理时,此功能允许SDP发送尽可能多的64B对齐写请求。下图显示了批量为2的情况。

CMAC和CACC之间的协议是只有效的协议。在溢出的情况下,CACC使用有效信用协议来回压CSC。

功耗

卷积累加器之间的协议在数据路径中应用时钟门控,卷积累加器的数据路径时钟在空闲时被选通,并且可编程寄存器中没有可用的硬件层。CACC内的可编程寄存器没有时钟门控以允许新的指令被编程。即使在CMAC和CACC也是仅有效的协议。在溢出的情况下,CACC使用有效信用协议来回压CSC。

end

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: involution是一种用于视觉识别的算法,它反转了卷积的内在特性。它通过将卷积操作中的滤波器权重转换为可学习的点积操作,从而提高了模型的效率和准确性。involution算法在计算机视觉领域中具有广泛的应用,特别是在目标检测和图像分割等任务中。 ### 回答2: involution是在计算机视觉领域中概念比较新的一种方法。它是对传统卷积算法的一种逆运算,用来增强卷积神经网络中的非线性建模能力。involution的核心思想是在特征图的每个位置上利用可学习的感受野(receptive field)来进行特征融合,使得网络可以更好地捕捉目标之间的全局关系。 举个例子,我们在计算机视觉中常用的卷积层中,每一个卷积核通常只能对应一个大小固定的感受野。而involution层通过在每个位置上学习一个可变大小的感受野来取代卷积核,从而增强了网络对于目标间距离的捕捉。同时,involution层不仅可以被添加到普通的卷积神经网络中,还可以嵌入到注意力机制、自注意力机制等模型中,提高了模型的表达能力和性能。 相对于传统的卷积层,involution层有多方面的优点。首先,可变感受野大小的应用让involution能够处理更加复杂的视觉场景。其次,involution能够更好地捕捉目标之间的全局关系,对于跨越较大距离的目标关系识别和图像分割等任务非常有效。最后,involution的结构相对简单,不需要过多的计算与存储,可以大幅度减少网络的训练时间和计算资源占用,同时保证优秀的性能表现。 总之,involution可以被看作是一种高效而又强大的计算机视觉算法,对于面对复杂的图像场景和目标识别任务的解决具有重要的意义。 ### 回答3: Involution是近年来计算机视觉领域中一个新的概念,是一种反转卷积(convolution)的方法,可以更高效地进行视觉识别。所谓卷积,即是将一个滤波器与输入数据的每一个小区域进行乘法运算,然后将所有乘积相加得到一个数值作为输出。而在深度学习中,我们通常使用卷积神经网络来对输入数据进行分类或识别。 然而,在深度学习中,卷积处理是一件十分耗费计算资源的任务。特别是当我们需要处理高分辨率的图像时,其复杂度更是极高。因此,为了提高卷积神经网络的效率,Involution便应运而生。 那么,Involution到底是如何实现反转卷积的呢?其实,它的实现方法非常简单。它通过将输入数据划分成不同的区域,然后在每个小区域内执行局部变换操作,最后再将每个小区域的结果组合成一个输出。这种做法可以使得计算量大幅度降低,同时还可以减少运算中的参数数量。而且,按照这种方法执行的Involution操作还可以在不同分辨率之间进行协作,进一步提高神经网络的效率和准确率。 总之,Involution通过将输入数据分解成小块,实现了卷积操作的反转,从而实现了对图像的高效处理,特别是对于大尺度的图像和超高分辨率的图像,效果是非常显著的。其简单而有效的原理,有望成为未来深度学习领域的重要研究方向之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值