NVDLA专题4:具体模块介绍——Convolution DMA

概述

Convolution DMA Module的定义在NV_NVDLA_cmda.v中,其module的定义如下:

module NV_NVDLA_cdma (
   cdma_dat2cvif_rd_req_ready    //|< i
  ,cdma_dat2mcif_rd_req_ready    //|< i
  ,cdma_wt2cvif_rd_req_ready     //|< i
  ,cdma_wt2mcif_rd_req_ready     //|< i
  ,csb2cdma_req_pd               //|< i
  ,csb2cdma_req_pvld             //|< i
  ,cvif2cdma_dat_rd_rsp_pd       //|< i
  ,cvif2cdma_dat_rd_rsp_valid    //|< i
  ,cvif2cdma_wt_rd_rsp_pd        //|< i
  ,cvif2cdma_wt_rd_rsp_valid     //|< i
  ,dla_clk_ovr_on_sync           //|< i
  ,global_clk_ovr_on_sync        //|< i
  ,mcif2cdma_dat_rd_rsp_pd       //|< i
  ,mcif2cdma_dat_rd_rsp_valid    //|< i
  ,mcif2cdma_wt_rd_rsp_pd        //|< i
  ,mcif2cdma_wt_rd_rsp_valid     //|< i
  ,nvdla_core_clk                //|< i
  ,nvdla_core_rstn               //|< i
  ,pwrbus_ram_pd                 //|< i
  ,sc2cdma_dat_entries           //|< i
  ,sc2cdma_dat_pending_req       //|< i
  ,sc2cdma_dat_slices            //|< i
  ,sc2cdma_dat_updt              //|< i
  ,sc2cdma_wmb_entries           //|< i
  ,sc2cdma_wt_entries            //|< i
  ,sc2cdma_wt_kernels            //|< i
  ,sc2cdma_wt_pending_req        //|< i
  ,sc2cdma_wt_updt               //|< i
  ,tmc2slcg_disable_clock_gating //|< i
  ,cdma2buf_dat_wr_addr          //|> o
  ,cdma2buf_dat_wr_data          //|> o
  ,cdma2buf_dat_wr_en            //|> o
  ,cdma2buf_dat_wr_hsel          //|> o
  ,cdma2buf_wt_wr_addr           //|> o
  ,cdma2buf_wt_wr_data           //|> o
  ,cdma2buf_wt_wr_en             //|> o
  ,cdma2buf_wt_wr_hsel           //|> o
  ,cdma2csb_resp_pd              //|> o
  ,cdma2csb_resp_valid           //|> o
  ,cdma2sc_dat_entries           //|> o
  ,cdma2sc_dat_pending_ack       //|> o
  ,cdma2sc_dat_slices            //|> o
  ,cdma2sc_dat_updt              //|> o
  ,cdma2sc_wmb_entries           //|> o
  ,cdma2sc_wt_entries            //|> o
  ,cdma2sc_wt_kernels            //|> o
  ,cdma2sc_wt_pending_ack        //|> o
  ,cdma2sc_wt_updt               //|> o
  ,cdma_dat2cvif_rd_req_pd       //|> o
  ,cdma_dat2cvif_rd_req_valid    //|> o
  ,cdma_dat2glb_done_intr_pd     //|> o
  ,cdma_dat2mcif_rd_req_pd       //|> o
  ,cdma_dat2mcif_rd_req_valid    //|> o
  ,cdma_wt2cvif_rd_req_pd        //|> o
  ,cdma_wt2cvif_rd_req_valid     //|> o
  ,cdma_wt2glb_done_intr_pd      //|> o
  ,cdma_wt2mcif_rd_req_pd        //|> o
  ,cdma_wt2mcif_rd_req_valid     //|> o
  ,csb2cdma_req_prdy             //|> o
  ,cvif2cdma_dat_rd_rsp_ready    //|> o
  ,cvif2cdma_wt_rd_rsp_ready     //|> o
  ,mcif2cdma_dat_rd_rsp_ready    //|> o
  ,mcif2cdma_wt_rd_rsp_ready     //|> o
  );


//
// NV_NVDLA_cdma_ports.v
//
input  nvdla_core_clk;   /* cdma2buf_dat_wr, cdma2buf_wt_wr, cdma2csb_resp, cdma2sc_dat_pending, cdma2sc_wt_pending, cdma_dat2cvif_rd_req, cdma_dat2glb_done_intr, cdma_dat2mcif_rd_req, cdma_wt2cvif_rd_req, cdma_wt2glb_done_intr, cdma_wt2mcif_rd_req, csb2cdma_req, cvif2cdma_dat_rd_rsp, cvif2cdma_wt_rd_rsp, dat_up_cdma2sc, dat_up_sc2cdma, mcif2cdma_dat_rd_rsp, mcif2cdma_wt_rd_rsp, sc2cdma_dat_pending, sc2cdma_wt_pending, wt_up_cdma2sc, wt_up_sc2cdma */
input  nvdla_core_rstn;  /* cdma2buf_dat_wr, cdma2buf_wt_wr, cdma2csb_resp, cdma2sc_dat_pending, cdma2sc_wt_pending, cdma_dat2cvif_rd_req, cdma_dat2glb_done_intr, cdma_dat2mcif_rd_req, cdma_wt2cvif_rd_req, cdma_wt2glb_done_intr, cdma_wt2mcif_rd_req, csb2cdma_req, cvif2cdma_dat_rd_rsp, cvif2cdma_wt_rd_rsp, dat_up_cdma2sc, dat_up_sc2cdma, mcif2cdma_dat_rd_rsp, mcif2cdma_wt_rd_rsp, sc2cdma_dat_pending, sc2cdma_wt_pending, wt_up_cdma2sc, wt_up_sc2cdma */

output          cdma2buf_dat_wr_en;    /* data valid */
output   [11:0] cdma2buf_dat_wr_addr;
output    [1:0] cdma2buf_dat_wr_hsel;
output [1023:0] cdma2buf_dat_wr_data;

output         cdma2buf_wt_wr_en;    /* data valid */
output  [11:0] cdma2buf_wt_wr_addr;
output         cdma2buf_wt_wr_hsel;
output [511:0] cdma2buf_wt_wr_data;

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

output  cdma2sc_dat_pending_ack;

output  cdma2sc_wt_pending_ack;

output        cdma_dat2cvif_rd_req_valid;  /* data valid */
input         cdma_dat2cvif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_dat2cvif_rd_req_pd;

output [1:0] cdma_dat2glb_done_intr_pd;

output        cdma_dat2mcif_rd_req_valid;  /* data valid */
input         cdma_dat2mcif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_dat2mcif_rd_req_pd;

output        cdma_wt2cvif_rd_req_valid;  /* data valid */
input         cdma_wt2cvif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_wt2cvif_rd_req_pd;

output [1:0] cdma_wt2glb_done_intr_pd;

output        cdma_wt2mcif_rd_req_valid;  /* data valid */
input         cdma_wt2mcif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_wt2mcif_rd_req_pd;

input         csb2cdma_req_pvld;  /* data valid */
output        csb2cdma_req_prdy;  /* data return handshake */
input  [62:0] csb2cdma_req_pd;

input          cvif2cdma_dat_rd_rsp_valid;  /* data valid */
output         cvif2cdma_dat_rd_rsp_ready;  /* data return handshake */
input  [513:0] cvif2cdma_dat_rd_rsp_pd;

input          cvif2cdma_wt_rd_rsp_valid;  /* data valid */
output         cvif2cdma_wt_rd_rsp_ready;  /* data return handshake */
input  [513:0] cvif2cdma_wt_rd_rsp_pd;

output        cdma2sc_dat_updt;     /* data valid */
output [11:0] cdma2sc_dat_entries;
output [11:0] cdma2sc_dat_slices;

input        sc2cdma_dat_updt;     /* data valid */
input [11:0] sc2cdma_dat_entries;
input [11:0] sc2cdma_dat_slices;

input          mcif2cdma_dat_rd_rsp_valid;  /* data valid */
output         mcif2cdma_dat_rd_rsp_ready;  /* data return handshake */
input  [513:0] mcif2cdma_dat_rd_rsp_pd;

input          mcif2cdma_wt_rd_rsp_valid;  /* data valid */
output         mcif2cdma_wt_rd_rsp_ready;  /* data return handshake */
input  [513:0] mcif2cdma_wt_rd_rsp_pd;

input [31:0] pwrbus_ram_pd;

input  sc2cdma_dat_pending_req;

input  sc2cdma_wt_pending_req;

output        cdma2sc_wt_updt;      /* data valid */
output [13:0] cdma2sc_wt_kernels;
output [11:0] cdma2sc_wt_entries;
output  [8:0] cdma2sc_wmb_entries;

input        sc2cdma_wt_updt;      /* data valid */
input [13:0] sc2cdma_wt_kernels;
input [11:0] sc2cdma_wt_entries;
input  [8:0] sc2cdma_wmb_entries;

input   dla_clk_ovr_on_sync;
input   global_clk_ovr_on_sync;
input   tmc2slcg_disable_clock_gating;

卷积DMA (CDMA)是卷积流水线中的一个阶段。它从SRAM/DRAM中取出数据用来进行卷积运算,按照卷积引擎所需的顺序将其存储到缓冲器(卷积Buffer或CBUF)中。支持的输入格式有:

  • 像素数据
  • 特征数据
  • 未压缩/压缩的权重
  • WMB
  • WGS

两个读取通道从CDMA连接到AXI接口,它们是权重读取通道和数据读取通道。为了获取上面列出的输入格式,通道被配置为该格式的模式,下表记录了读取通道映射的输入数据格式。

卷积DMA仅发送存储读取请求,卷积DMA发送的所有存储读取请求都是64字节对齐的。

CDMA由三个子模块组成,用于提取像素数据或特征数据进行卷积:CDMA_DC(NV_NVDLA_CDMA_dc, NV_NVDLA_CDMA_dc.v)、CDMA_WG(NV_NVDLA_CDMA_wg, NV_NVDLA_CDMA_wg.v)和CDMA_IMG(NV_NVDLA_CDMA_img, NV_NVDLA_CDMA_img.v)。

这些子模块的流程是相似的,但不同之处在于它们如何将数据排列到CBUF RAM。在任何时候,只有一个子模块被激活来获取像素/特征数据。

以CDMA_DC为例介绍流程:

  • 检查卷积缓冲区的状态是否有足够的可用空间。
  • 生成读取事务
  • 在共享缓冲区中缓存特征数据
  • 将特征立方体重构(reshape)为合适的顺序
  • 生成卷积缓冲器写地址
  • 将特征数据写入卷积缓冲器
  • 更新CDMA_STATUS子模块中卷积缓冲器的状态

卷积DMA使用专用引擎来处理Winograd的请求,CDMA_WG的结构和功能与CDMA_DC非常相似。但是,卷积缓冲区中生成的特征数据组织是不同的,因此CDMA_WG有一个特殊的获取序列。另外,CDMA_WG总是执行Winograd通道扩展。

CDMA_IMG引擎从外部存储器获取像素数据,它根据数据格式生成地址,对像素元素重新排序,并将它们写入卷积缓冲器的适当entry。CDMA_IMG的基本行为类似于CDMA_DC,但它对像素数据进行操作。

只有CDMA_DC引擎支持多批次模式。也就是说,在一个硬件层中提取多个输入特征数据立方体以提高性能,最大批量可达32。

CDMA还使用一个专用引擎来获取权重:CDMA_WT。与其他DMA引擎相比,CDMA_WT很简单,只是它可以一次支持三个读流。如果输入重量格式是未压缩的,则它仅获取重量数据。如果输入重量格式是压缩的,则权重、WMB和WGS都会被提取。有关权重格式的更多详细信息,请参见数据格式的详细说明。

如果输入权重数据被压缩,两个仲裁器被使能用于读取流的顺序。首先,权重循环仲裁器批准来自权重流或WMB流的请求。然后,获胜者利用静态优先级仲裁与WGS请求流竞争,WGS总是有优先权。最终的获胜请求被发送到权重通道以获取数据。

CDMA_WT总是试图尽可能多地填充卷积缓冲器,直到空闲entries用完或权重获取完成。

CDMA维护并传送CBUF中权重缓冲器和输入数据缓冲器的状态。CDMA和CSC中有两份状态。两个模块交换更新/发布信息,以决定何时获取新的特征/像素/权重数据以及何时发布这些数据元素。

能耗

卷积DMA在数据路径中应用时钟门控。卷积DMA的数据路径时钟在空闲时被选通,并且在可编程寄存器中没有配置硬件层。卷积DMA中的regfile子模块没有时钟门控,因此可以对新命令进行编程。

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值