概述
卷积累加器(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的工作流程:
- 从assembly SRAM组预取累加和。
- 当部分和到达时,将它们与累积和一起发送到加法器阵列,如果部分和来自第一个stripe操作,则累计和应为0。
- 从加法器阵列的输出端收集新的累加和。
- 存储到assembly SRAM组中。
- 根据stripe操作重复步骤1~步骤3,直到完成一个通道操作。
- 如果通道操作完成,对加法器的输出进行round/saturate操作。
- 收集上一步的结果,并将它们存储到传送SRAM组中。
- 从传送缓冲区组加载结果并将其发送到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