网络学习笔记2——信号与系统
1.信号相关概念
信号:信号与系统范畴内,信号被描述为以时间为唯一自变量的函数,一般连续信号使用x(t)表示,离散信号使用x[n]表示
信号的功率与能量:描述信号能量的物理量,如下表中所示。当范围分别趋向于正无穷和负无穷时,为无限范围的能量。
定义
公式
信号在一定时间范围内的能量
$\int^{T1}{T2} \lvert x(t)\rvert^2dt$(连续)、 $\sum\limits^{T1}{n=T2} \lvert x[n] \rvert ^2$(离散)
信号在一定时间范围内的功率
$\frac{1}{T1-T2}\int^{T1}{T2} \lvert x(t) \rvert^2dt$(连续)、 $\frac{1}{T1-T2}\sum\limits^{T1}{n=T2} \lvert x[n] \rvert^2$(离散)
自变量变换:对于一个信号$ x(t) $ 进行自变量的线性变换 $ x(\alpha \times t + \beta) $,不同的变换组合如下表所示:
变换
参数变换
举例
时移
$\alpha = ...
网络学习笔记1——协议分层
分层概念网络协议是分层的,分层的概念类似于函数封装,不断提供更高级更抽象的接口,最后提供给客户使用。对于分层协议而言,整个协议共同完成一件事情,每个层次基于本层或低层接口完成本层次的功能并对更高级的层次提供接口,即对于每个层次而言,有以下两个主要功能:
对高级提供接口:将本层次的功能封装,供高层调用
实现本层功能:在本层中实现功能,一般通过调用低层提供的接口实现(最底层除外)
举一个例子,若要实现计算器计算的功能,我们实现一个计算器协议,其分为以下几个层次:
用户输入层:最高层,为用于提供数据输入方式和结果输出方式,实现用户输入与逻辑语言的相互转换
逻辑编译层:中间层,将逻辑语言转换为硬件可以实现的代码,实现计算,将结果转为逻辑语言
硬件层:最底层,实现代码的计算和结果的输出
假设厂商基于计算器协议构建了一个手写计算器,当用户需要进行1+1的运算时,以手写的方式输入计算需求,即一张手写图片,随后用户输入层将这个手写图片转换为逻辑语言R=1+1,调用逻辑编译层进行实现;逻辑编译层将其转换为汇编代码ADD R 1 1,调用硬件层进行实现;硬件层运行汇编代码得出结果R为2,并将结果反 ...
高级综合工具StratusHLS学习笔记(4)
HLS中使用浮点数学习目标:
使用浮点数
换用自己的库进行高级综合
HLS中的浮点数stratus HLS提供内置的浮点数,可以实现常规的加减乘操作,类型为:
1cynw_cm_float<e,f,accurcy,rounding mode,NaN handle>
该类型共有5个模板参数,分别如下所示:
e:指数位宽,为浮点数的指数位数
f:尾数位宽,为浮点数的尾数位数
accuracy:精确度,这一参数可以设置是否需要实现完整的IEEE标准浮点数。若需要实现则可以提高计算精度,若不实现则可以缩小面积提升性能。
rounding mode:取整模式,推测为浮点数尾数处理中如何取整,具有多种模式
NaN handle:用于选择如何处理NaN
对于指数位宽和尾数位宽,为每一个浮点数都具有的参数,不用过多解释;对于精确度,具有多种选项,每种选项具有不同的精度-代价折中,如下表所示:
标号
说明
CYNW_REDUCED_ACCURACY
默认情况,使用低精度低代价实现方法
CYNW_BEST_ACCURACY
使用IEEE标准的浮点数
CYNW_N ...
高级综合工具StratusHLS学习笔记(3)
学习目标:
学习如何使用Stratus IDE生成存储器模型
学习如何在代码中使用存储器模型
1.存储器生成存储器生成使用Stratus IDE内置的存储器模型生成器,首先使用Stratus IDE打开工程,在左侧边栏中打开project选项卡,打开libraries,右键Memories,选择New Memory Library新建存储器库,新建后可以在工程下发现同名文件夹
随后,右击新建的库memlib选择新建存储器,可以打开如下的界面进行配置:
Memory name:存储器名称,使用存储器时使用该名称进行调用
Word size:数据位宽,即每个地址存储多少个bit
Number of words:地址数量,即有多少个word,存储容量为$Word size \times Number of words$bit
Latency:从地址输入到数据输出消耗的时钟周期数量
Setup time:通常意义的建立时间加保持时间,即控制信号需要在时钟沿附近保持的长度,不要写0。
Output delay:输出延迟,即从时钟沿或数据输入到数据输出的延迟时间,不要写0。
Area:面积 ...
高级综合工具StratusHLS学习笔记(2)
学习目标为:
如何使用高级综合生成流水线
如何使用Stratus进行层次化设计
1.生成流水线Stratus允许指定一个主循环(while(1))中的内容为流水线方式实现,即每个时钟周期均可以进入数据执行,需要在主循环开始时添加如下语句指定使用流水线实现:
1HLS_PIPELINE_LOOP(<STALL_TYPE>, <cycle>, <name>);
上述指定该loop为流水线实现,具有三个参数,分别如下所示:
STALL_TYPE:实现类型,包括HARD_STALL和SOFT_STALL两种
cycle:数据进入间隔,即“每隔多少个时钟周期可进入一个数据”,当cycle=1时表示每个周期均可进入数据
name:流水线配置名称,每个循环流水线名称不同即可
对于STALL_TYPE中的两种,具有以下的区别:
HARD_STALL:当流水线的某一级阻塞时,整条流水线停止运行
SOFT_STALL:当流水线的某一级阻塞时,仅阻塞级之前的流水线停止运行,阻塞级之后的流水线继续运行
对于要生成流水线的代码片(循环体),Stratus有以下的要 ...
高级综合工具StratusHLS学习笔记(1)
本次学习参考Stratus内置的学习例程(simple_p2p),学习内容主要如下所示:
Stratus HLS软件运行需要的必要文件及其写法
Stratus HLS软件操作方式
Stratus HLS内置的p2p端口的基本使用(非流水线)
Stratus HLS自定义数据类型
1.Stratus HLS必要文件与写法Stratus工程所需要的文件如下图所示:
文件
类型
说明
设计文件
cpp+h
描述设计的头文件和cpp文件
TestBench
cpp+h
描述测试平台的头文件和cpp文件
System
cpp+h
连接设计文件和TestBench的头文件和cpp文件
main.cpp
cpp
整个仿真平台的顶层文件
project.tcl
tcl
指定工程配置(仿真选项和综合选项)的tcl文件
Makefile
makefile
由project.tcl生成的makefile文件
1.1.设计文件设计文件的头文件如下所示:
123456789101112131415161718192021222324252627282930#ifn ...
存储器体系结构学习笔记
存储器性能评价指标存储器停顿周期数存储器的性能直接影响到CPU的性能评价,定义存储器停顿周期数为CPU等待存储器访问而停顿的时钟周期数,由此有CPU执行时间有:
CPU执行时间=(CPU时钟周期数+存储器停顿时钟周期数) \times 时钟周期时间因此需要存储器停顿时钟周期数越小越好,对于这一变量有公式如下:
存储器停顿周期数 = 缺失数量 \times 缺失代价 = 指令数 \times \frac{产生缺失指令数量}{指令数} \times 缺失代价 \\ = 指令数 \times \frac{存储器访问指令数}{指令总数} \times 缺失率 \times 缺失代价其中,缺失率表示存储器访问指令中会产生cache缺失的百分比;缺失代价表示发生cache缺失后为了解决缺失需要消耗的平均时钟周期数。另一种度量指标与时钟周期无关,即为每条指令的平均缺失数:
平均缺失数=\frac{产生访存缺失的指令数}{指令总数} = 缺失率 \times \frac{存储器访问指令数}{指令总数}上述公式与缺失代价无关,缺失率的定义与上文相同
存储器平均访问时间缓存性能比较好的度量为存储器平 ...
EIE结构与算法映射
算法基础EIE(Efficient Inference Engine)的算法基础是一种被称为Deep Compression的神经网络压缩算法。EIE可以说是为Deep Compression量身定制的硬件,Deep Compression的算法流程如下所示:
剪枝:将小于某个阈值的权值直接置为0,这一操作引入权值的稀疏性
量化:这里的量化是一种非线性量化,通过k近邻类聚算法确定量化中心和量化间隔
编码:原文中使用霍夫曼编码压缩权值的存储,EIE中使用CSC压缩存储方式
Deep Compression压缩Deep Compression压缩分为剪枝、量化和编码操作。其中剪枝为对所有权值做以下操作:
pruning(x) = \begin{cases}x & x > T \\ 0 & x \leq T\end{cases}其中T为剪枝阈值,该步骤将所有小于剪枝阈值T的权值置为0,引入了权值的稀疏性。原文中对于VGG结构的剪枝后,卷积层的非零参数量一般还剩原参数量的30%~60%中,全连接层的非零参数量一般仅剩5%以下,由于全连接层参数占参数的主要部分,因此全网络的非零参数量仅剩 ...
基2FFT原理
FFT前置知识FT和DFT傅里叶变换FT(fourier transform)用于将时域信号$x(t)$和频域信号$X(f)$之间变换,公式如下所示:
X(f) = \int^{\infty}_{-\infty}x(t)e^{-j2\pi ft}dt \\
x(t) = \int^{\infty}_{-\infty}X(f)e^{j2\pi ft}df对于计算机系统中,无法处理连续的过程,因此离散化为离散傅里叶变换DFT(Discrete Fourier Transform):
X[k] = \frac{1}{N}\sum\limits^{N-1}_{n=0} x[n] \times e^{-\frac{2\pi k}{N}j\times n} \\
x[n] = \frac{1}{N}\sum\limits^{N-1}_{k=0} X[k]\times e^{-\frac{2\pi n}{N}j\times k}取$W_N = e^{-\frac{2\pi}{N}j}$,可将DFT改写为以下公式:
X[k] = \frac{1}{N}\sum\limits^{N-1}_{n= ...
浮点数处理
浮点数表达IEEE754标准是用于规范浮点数运算的IEEE标准,用于解决浮点数标准混乱的问题。其被认证后不久,几乎所有的处理器生产商都采用这一标准,极大的推动了软件的发展。浮点数存储的格式如下:
浮点数由符号位,指数位和尾数三个部分组成,表达公式如下式:
X = (-1)^{s} \times f \times 2^{e}在IEEE754标准中,主要规定了单精度浮点(float)和双精度浮点(double)两种浮点数:
类型
符号位数
指数位数
尾数位数
单精度浮点(float)
1
8
23
双精度浮点(double)
1
11
52
首先考虑符号位,当该符号位为0时,表示该数为正数,符号位为1时,表示该数为负数。指数可以为负数,一般使用移码表示,移码表示为:
E = e- biasE为真实的指数,e为浮点数中存储的尾数,bias为移位,有$bias = 2^{len(e) - 1} - 1$。以单精度浮点为例,指数位数$len(e) = 8$,则有bias=127,真实指数和存储的关系为$E = e - 127$,表示范围为-126~127(e=0 ...