资讯动态

TVM VTA 硬件设计指南:从 ISA 到微架构的深度学习加速器全解析

发布时间:2026/9/24 4:30:25 来源:尧图企业网站定制
编译器深度学习模型优化【免费下载链接】tvmOpen deep learning compiler stack for cpu, gpu and specialized accelerators项目地址https://gitcode.com/gh_mirrors/tvm7/tvm点击查看免费下载VTAVersatile Tensor Accelerator是 Apache TVM 项目中的通用深度学习加速器参考设计其核心是一台面向稠密线性代数的 RISC 风格张量处理器。本文以 VTA 硬件设计文档 为主线自上而下剖析 VTA 的架构设计与 ISA 软硬件接口、微架构模块划分与计算核心的微码规范并结合仓库中 Python 编译环境、VTA 运行时 与 配置文档 等源码级证据帮助读者完整理解这台可配置加速器的硬件-软件协同设计哲学。VTA 总体架构一台面向张量寄存器的 RISC 处理器VTA 是专门为快速、高效执行稠密线性代数dense linear algebra而设计的通用深度学习加速器。与通用 CPU 不同VTA 内置一个简单的 RISC 风格处理器但其操作对象并非标量寄存器而是秩 1向量或秩 2矩阵的张量寄存器。为了隐藏内存访问延迟设计还采用了**解耦执行-访问decoupled access-execute**的经典架构思想。从更宏观的视角看VTA 可以充当全栈优化full stack optimization的模板型深度学习加速器设计它向编译器栈暴露一个通用的张量计算接口让 TVM 编译器能够针对该硬件结构做完整的软硬件协同优化。VTA 整体由四个硬件模块组成模块之间通过 FIFO 队列与局部存储块SRAM通信从而实现任务级流水线并行模块职责Fetch取指模块从 DRAM 加载指令流对指令做部分译码后路由到三条命令队列之一Load加载模块将输入与权值张量从 DRAM 载入片上专用的数据存储Compute计算模块通过 GEMM 核心执行稠密线性代数计算通过张量 ALU 执行通用计算同时负责将数据从 DRAM 载入寄存器堆以及将微操作内核micro-op kernel载入微操作缓存Store存储模块将计算核心产生的结果写回 DRAMHLS 硬件源码组织VTA 硬件当前使用Vivado HLS C进行描述该语言仅受 Xilinx 工具链支持。硬件源码位于3rdparty/vta-hw/hardware/xilinx/sources该目录由 vta-hw 硬件子仓库提供vta.cc包含每个 VTA 模块的定义以及顶层 VTA 设计的行为级模型。vta.h使用 Xilinxap_int类型定义的类型定义与函数原型声明。此外预处理器宏定义在3rdparty/vta-hw/include/vta/hw_spec.h中其中大部分宏定义来源于3rdparty/vta-hw/config/vta_config.json中列出的参数。该 JSON 文件由3rdparty/vta-hw/config/vta_config.py处理生成一串定义预处理器宏的编译选项这串选项由 makefile 使用从而把高层参数同时传递给 HLS 硬件综合编译器与构建 VTA 运行时的 C 编译器。配置参数的完整说明可参见仓库中的 VTA 配置文档例如LOG_INP_WIDTH输入数据类型位宽log2 表示、LOG_BATCH/LOG_BLOCK矩阵乘张量化内联的维度、LOG_UOP_BUFF_SIZE等片上缓冲大小。HLS 模块示例以 fetch 模块为例下面展示其中一个 VTA 模块的 C 定义取自vta.cc该模块从 DRAM 读取指令流、做部分译码并按 opcode 路由到对应队列void fetch( uint32_t insn_count, volatile insn_T *insns, hls::streaminsn_T load_queue, hls::streaminsn_T gemm_queue, hls::streaminsn_T store_queue) { #pragma HLS INTERFACE s_axilite port insn_count bundle CONTROL_BUS #pragma HLS INTERFACE m_axi port insns offset slave bundle ins_port #pragma HLS INTERFACE axis port load_queue #pragma HLS INTERFACE axis port gemm_queue #pragma HLS INTERFACE axis port store_queue #pragma HLS INTERFACE s_axilite port return bundle CONTROL_BUS INSN_DECODE: for (int pc 0; pc insn_count; pc) { #pragma HLS PIPELINE II 1 // Read instruction fields insn_T insn insns[pc]; // Do some partial decoding opcode_T opcode insn.range(VTA_INSN_MEM_0_1, VTA_INSN_MEM_0_0); memop_id_T memory_type insn.range(VTA_INSN_MEM_5_1, VTA_INSN_MEM_5_0); // Push to appropriate instruction queue if (opcode VTA_OPCODE_STORE) { store_queue.write(insn); } else if (opcode VTA_OPCODE_LOAD (memory_type VTA_MEM_ID_INP || memory_type VTA_MEM_ID_WGT)) { load_queue.write(insn); } else { gemm_queue.write(insn); } } }从该示例可以总结出 HLS 编码的两类关键要素关于参数Parameters每个函数的参数列表与接口 pragma 共同决定了综合出的硬件模块所暴露的硬件接口。按值传递的参数表示只读的硬件内存映射寄存器主机可向其写入。例如insn_count参数会被综合成内存映射寄存器供主机写入以设定某段 VTA 指令序列的长度。指针参数的含义取决于所使用的接口 pragma搭配m_axi接口 pragma 时会生成 AXI requestor 接口提供对 DRAM 的 DMA 访问搭配bram接口 pragma 时会生成 BRAM 接口向 FPGA 块 RAM 暴露读/写端口。按引用传递的 HLS 流stream配合axis接口 pragma会产生指向模块的 FIFO 接口。硬件 FIFO 提供了模块之间有用的同步机制。关于 Pragmas编译器 pragma 对定义每个模块的硬件实现至关重要。HLS INTERFACE指定综合出的硬件模块的接口。HLS PIPELINE通过设定启动间隔initiation interval, II目标定义硬件流水线性能目标。当设定II 1时告诉编译器综合出的硬件流水线每个周期应能执行一次循环迭代。HLS DEPENDENCE指示编译器忽略给定循环中的某些依赖检查。考虑一个循环体对同一 BRAM 结构既写又读、且需要达到 II 为 1 的场景HLS 编译器必须假设最坏情况——读操作访问的是上一周期刚被写操作更新的地址这在 BRAM 时序特性下无法实现至少需要 2 个周期才能看到更新后的值。因此为了达到 II 为 1必须放宽依赖检查。需要注意的是开启此优化后防止写后读同一地址的责任就落到了软件栈身上。上述 HLS 相关内容面向 Xilinx 2018.2 工具链更完整、更深入的 HLS 规范可参考 Xilinx 官方 HLS 参考手册ug902-vivado-high-level-synthesis。架构级概览指令集架构ISAVTA 的指令集架构由4 条 CISC 指令组成指令具有可变的执行延迟其中两条指令会执行一段微码指令序列来完成计算指令功能执行模块LOAD从 DRAM 将 2D 张量载入输入缓冲、权值缓冲或寄存器堆也可将微内核载入微操作缓存支持在加载输入与权值 tile 时进行动态填充paddingLoad 或 Compute 模块取决于存储缓冲目标GEMM在输入张量与权值张量上执行微操作序列的矩阵乘-矩阵乘运算并将结果累加到寄存器堆张量Compute 模块的 GEMM 核心ALU对寄存器堆张量数据执行微操作序列的矩阵-矩阵 ALU 运算Compute 模块的张量 ALUSTORE将 2D 张量从输出缓冲写回 DRAMStore 模块其中LOAD指令根据存储缓冲目标位置由 load 或 compute 模块执行GEMM与ALU指令由 compute 模块的 GEMM 核心与张量 ALU 执行STORE指令仅由 store 模块执行。指令各字段的详细含义在文档的微架构uarch部分进一步说明。值得强调的是VTA 的 ISA 会随架构参数变化而改变如 GEMM 核心形状、数据类型、存储大小等因此 ISA 不保证在不同 VTA 变体之间兼容。这在该设计中是可接受的VTA 运行时能自适应参数变化为生成的加速器版本量身定制二进制代码。这正体现了 VTA 栈所秉持的协同设计co-design哲学——拥抱软硬件接口的流动性。数据流执行Dataflow ExecutionVTA 依靠硬件模块之间的依赖 FIFO 队列来同步并发任务的执行。通过依赖 FIFO 队列和单读单写single-reader/single-writer的 SRAM 缓冲每个硬件模块可以与其生产者、消费者模块并发执行形成数据流式的执行方式。每个模块通过**读后写RAW与写后读WAR**依赖队列与其消费者和生产者相连。模块执行一条指令的伪代码逻辑如下首先在硬件中译码每条指令内的依赖标志若指令有入向 RAW 依赖执行需要等待从生产者模块收到 RAW 依赖令牌若任务有入向 WAR 依赖执行需要等待从消费者模块收到 WAR 依赖令牌任务完成时检查出向 RAW 与 WAR 依赖分别通知消费者与生产者模块。需要说明的是这里的依赖令牌是**无信息量information-less**的——因为各模块执行的指令按 FIFO 顺序到达、设计上不允许重排令牌只需表达已完成这一信号即可。流水线可扩展性Pipeline Expandability默认 VTA 设计由四个模块构成一条3 阶段load-compute-store任务流水线。遵循数据流硬件组织原则VTA 流水线可以被扩展以包含更多阶段。例如可以设想将张量 ALU 与 GEMM 核心分离以最大化 GEMM 核心的利用率从而形成一条load-gemm-activate-store任务流水线——这与 TPU 的设计思路高度接近。但增加流水线阶段是有代价的它会增加存储与额外逻辑开销这正是默认设计选择 3 阶段流水线的原因。微架构级概览所有模块定义都包含在3rdparty/vta-hw/hardware/xilinx/sources/vta.cc中。下面逐一剖析各模块。Fetch 模块VTA 由一条线性指令流编程。fetch 模块是 VTA 面向 CPU 的入口通过三个内存映射寄存器编程寄存器类型作用control读写启动 fetch 模块读取以检查其是否完成insn_count只写设定要执行的指令数量insns只写设定 DRAM 中指令流的起始地址CPU 在由 VTA 运行时准备的物理连续缓冲中编排好指令流后将起始物理地址写入insns寄存器将指令流长度写入insn_count寄存器并在control寄存器中置位启动信号。该过程启动 VTAVTA 通过 DMA 从 DRAM 读入指令流。fetch 模块访问指令流后会对指令做部分译码并将指令推入分别供给 load、compute 与 store 模块的命令队列STORE指令推入 store 命令队列由 store 模块处理GEMM与ALU指令推入 compute 命令队列由 compute 模块处理描述微操作内核或寄存器堆数据加载的LOAD指令推入 compute 命令队列由 compute 模块处理描述输入或权值数据加载的LOAD指令推入 load 命令队列由 load 模块处理。当某条命令队列变满时fetch 模块会暂停直到队列不再满为止。因此命令队列的深度被设计得足够深以提供宽执行窗口让多个任务能够在load-compute-store流水线中并发在途执行。这一启动-完成协议与运行时接口一一对应在 VTA 运行时头文件 中VTATLSCommandHandle获取线程局部的命令句柄VTAWriteBarrier/VTAReadBarrier在 CPU 与 VTA 之间同步内存可见性VTASynchronize则负责提交所有指令到 VTA 并等待加速器完成工作与 fetch 模块的control寄存器启动/轮询机制形成软硬件闭环。Compute 模块VTA 的 compute 模块相当于一台在张量寄存器而非标量寄存器上执行计算的 RISC 处理器。两个功能单元会修改寄存器堆张量 ALU与GEMM 核心。compute 模块从微操作缓存执行 RISC 微操作micro-ops微操作分为 ALU 与 GEMM 两类。为最小化微操作内核的存储占用、同时避免引入条件跳转等控制流指令compute 模块在两层嵌套循环内执行微操作序列并通过**仿射函数affine function**计算每个张量寄存器位置。这种压缩方式大幅削减了微内核的指令占用且对神经网络算子中常见的矩阵乘法与 2D 卷积都适用。GEMM 核心执行 GEMM 指令时在两层的嵌套循环中执行微码序列。GEMM 核心每个周期可完成一次输入-权值矩阵乘。单周期矩阵乘法的维度定义了一个硬件张量化内联tensorization intrinsicTVM 编译器必须把计算调度降级到该内联上。这个张量化内联由输入、权值与累加器张量的维度共同定义。每种数据类型可以采用不同的整数精度典型配置下权值与输入类型都是低精度8 位或更低而累加器张量使用更宽的类型32 位以防止溢出。为了保持 GEMM 核心忙碌输入缓冲、权值缓冲与寄存器堆都必须暴露足够的读/写带宽——这一点在 编译环境 中体现为INP_ELEM_BITS、WGT_ELEM_BITS、ACC_ELEM_BITS等按批次/通道位宽展开的带宽量化参数。张量 ALU支持一组标准运算用于实现常见的激活、归一化与池化算子。VTA 采用模块化设计因此张量 ALU 支持的算子范围可以扩展以提高算子覆盖度代价是更高的资源利用率。张量 ALU 可以执行张量-张量运算也可以对立即数执行张量-标量运算。张量 ALU 的 opcode 与立即数由高层 CISC 指令指定在张量 ALU 计算语境下微码只负责指定数据访问模式。关于张量 ALU 的吞吐量有一个重要限制它不能以每周期一个操作的速度执行。瓶颈在于读端口不足——由于每个周期只能读取一个寄存器堆张量张量 ALU 的启动间隔至少为 2即每 2 个周期至多执行 1 次操作。此外单次张量-张量操作代价高昂尤其考虑到寄存器堆类型通常很宽典型为 32 位整数。因此为平衡张量 ALU 与 GEMM 核心的资源占用默认情况下张量-张量操作通过多个周期的向量-向量操作来完成。对应到运行时层面runtime.h 中的VTAUopPush接口精确刻画了这一微操作模型mode置 0 为 GEMM 模式accum[dst] GEMM(input[src], weight[wgt])置 1 为 ALU 模式按use_imm选择accum[dst] opcode(accum[dst], imm_val)或accum[dst] opcode(accum[dst], accum[src])VTAUopLoopBegin/VTAUopLoopEnd则对应了微操作内核中的嵌套循环与dst_factor/src_factor/wgt_factor等仿射索引因子。Load 与 Store 模块load 与 store 模块执行从 DRAM 到 SRAM 的带跨步访问模式的 2D DMA 加载。此外load 模块可以即时插入 2D 填充padding这在分块处理 2D 卷积时非常有用——意味着 VTA 可以对 2D 卷积输入分块而无需付出在 DRAM 中重新排布数据以在输入与权值 tile 周围插入空间填充的开销。运行时接口VTALoadBuffer2D与VTAStoreBuffer2D见 runtime.h直接反映了这一设计VTALoadBuffer2D携带x_size/y_size按向量元素计量的二维尺寸、x_stride跨步、x_pad_before/y_pad_before/x_pad_after/y_pad_after四周填充以及dst_sram_index/dst_memory_type目标 SRAM 索引与存储类型等参数VTAStoreBuffer2D则定义了从 SRAM 以跨步模式写回 DRAM 的对称操作。存储类型如MEM_ID_UOP、MEM_ID_WGT、MEM_ID_INP、MEM_ID_ACC、MEM_ID_OUT见 environment.py在软件栈与硬件侧保持一致。软硬件协同从配置到运行时的闭环理解 VTA 硬件设计的最后一块拼图是软硬件接口的闭环配置驱动硬件vta_config.json中的高层参数数据类型位宽、GEMM 内联形状、缓冲大小等经vta_config.py转为编译宏同时驱动 HLS 综合与 VTA 运行时构建运行时驱动设备vta/runtime/runtime.h定义了VTALoadBuffer2D、VTAStoreBuffer2D、VTAUopPush、VTADepPush/VTADepPop、VTASynchronize等完整设备驱动 API其中VTADepPush/VTADepPop正是数据流执行中 RAW/WAR 依赖令牌机制的软件侧对应编译器适配 ISAvta/python/vta/environment.py中的Environment类从配置派生BATCH、BLOCK_IN、BLOCK_OUT、各缓冲大小以及数据类型等派生参数供 TVM 编译调度降级到 GEMM 张量化内联与 ALU/load/store 指令生成与当前加速器版本严格匹配的二进制。由此VTA 的硬件设计并非一份孤立的 RTL 文档而是一个配置可变的模板加速器硬件结构fetch/load/compute/store 四模块流水线保持稳定具体参数由配置驱动ISA 随之演化而运行时与编译器自动适配。这正是 VTA 作为全栈深度学习加速器参考设计的核心价值所在——为 TVM 的编译、调度、自动调优与硬件部署提供了一座可编程、可复现的桥头堡。赞分享编译器深度学习模型优化【免费下载链接】tvmOpen deep learning compiler stack for cpu, gpu and specialized accelerators项目地址https://gitcode.com/gh_mirrors/tvm7/tvm点击查看免费下载相关推荐TVM VTA 设计与开发指南可配置深度学习加速器的软硬件全栈解析TVM VTA 设计与开发指南可配置深度学习加速器的软硬件全栈解析 VTAVersatile Tensor Accelerator通用张量加速器是 TV编译器深度学习模型优化VTA 深度学习加速器栈详解TVM 编译器驱动的开源模块化硬件设计VTA 深度学习加速器栈详解TVM 编译器驱动的开源模块化硬件设计 导读 VTAVersatile Tensor Accelerator是 Apache编译器深度学习模型优化VTA基于 TVM 的开源可定制深度学习加速器栈——安装、配置与硬件架构全指南VTA基于 TVM 的开源可定制深度学习加速器栈——安装、配置与硬件架构全指南 VTAVersatile Tensor Accelerator通用张量加速编译器深度学习模型优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价