开源加速器Gemmini代码解析(一):脉动阵列

本文预设读者已了解脉动矩阵基本原理。

Gemmini中脉动阵列框图如下【1】:
在这里插入图片描述
PE(process element)是阵列最小单元,实现一维乘加计算。然后PEs规律地按照行列排列成二维的Tile,需要注意Tile里每一个PE是纯组合地连接,PE之间并无寄存器存储中间结果。Tiles则流水地排列起来组成整个脉动阵列,Tile之间插入了寄存器。这一点从后面的代码分析可以了解得更清楚。需要计算的数据则被提前按照一定规律或是存入脉动阵列或是排列在脉动阵列周围的存储器(bank)里。

GEMM的参数:

object  Constant {
   
  def inputType = UInt(32.W)
  def outputType = UInt(32.W) 
  def accType = UInt(32.W)

  def OS = false.B
  def WS = true.B
  def df = OS
  def latency = 0
  def tileRows=16
  def tileColumns=16
  def meshRows=16
  def meshColumns=16
}

基础单元PE

脉动阵列最核心代码为Mesh模块,包括Tile、PE、PEcontrol等子模块,最基础单元为PE模型。由于Gemmini中脉动阵列(systolic matrix)模块支持两种数据流,OS(output stationary)和WS(weight stationary)模式,因此PE结构较为复杂,输入控制端信号较多。甚至自定义了IO端口模块PEcontrol,源码如下:

class PEControl extends Bundle{
   
    //define two control signal
    val propagate = UInt(1.W)
    val dataflow = UInt(1.W)
}

latency参数指定要在PEs中添加多少个移位寄存器,因为有些数据类型的乘加操作无法在一个周期完成,如浮点数等。

  • 端口定义:
  val io = IO(new Bundle {
   
    val in_a = Input(inputType)
    val in_b = Input(outputType)
    val in_d = Input(outputType)

    val out_a = Output(inputType)
    val out_b = Output(outputType)
    val out_c = Output(outputType)

    val in_control = Input(new PEControl(accType))
    val out_control = Outp
  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
iperf是一个广泛使用的网络性能测量工具,支持TCP和UDP协议。它可以用于测试网络的吞吐量、带宽、延迟、抖动等性能指标。 整个iperf的源代码主要分为两部分:客户端和服务器端。客户端主要负责向服务器端发送数据并测量网络性能,而服务器端则负责接收客户端发送的数据并计算性能指标。 下面我们来分别分析客户端和服务器端的源代码实现。 ### 客户端 客户端的主要功能是向服务器端发送数据并测量网络性能。下面是客户端的主要实现步骤: 1. 命令行参数解析:客户端通过解析命令行参数来获取需要连接的服务器地址、端口号、测试时间、传输协议等信息。 2. 建立连接:客户端通过socket API建立与服务器端的连接。 3. 发送数据:客户端通过循环发送数据包的方式向服务器端发送数据。 4. 接收数据并计算性能指标:客户端通过循环接收服务器端返回的数据包,并根据接收到的数据包计算网络性能指标,如带宽、延迟等。 5. 输出测试结果:客户端最后将测试结果输出到命令行界面或者日志文件中。 客户端的源代码实现比较简单,主要是通过socket API来实现数据的发送和接收,并通过计算性能指标来实现性能测量。其中,核心代码主要在`iperf_client.cpp`文件中实现。 ### 服务器端 服务器端的主要功能是接收客户端发送的数据并计算性能指标。下面是服务器端的主要实现步骤: 1. 命令行参数解析:服务器端通过解析命令行参数来获取监听的端口号、传输协议等信息。 2. 建立监听:服务器端通过socket API建立监听,并等待客户端的连接请求。 3. 接收数据:服务器端通过循环接收客户端发送的数据包,并将接收到的数据包放入缓存中。 4. 计算性能指标:服务器端通过缓存中的数据包来计算网络性能指标,如带宽、延迟等。 5. 输出测试结果:服务器端最后将测试结果输出到命令行界面或者日志文件中。 服务器端的源代码实现比较简单,主要是通过socket API来实现数据的接收,并通过计算性能指标来实现性能测量。其中,核心代码主要在`iperf_server.cpp`文件中实现。 总体来说,iperf的源代码实现比较简单,主要是通过socket API来实现网络数据传输,并通过计算性能指标来实现性能测量。如果你想深入了解iperf的实现细节,可以通过阅读源代码来进一步了解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值