ic进阶|性能篇02:一文带你了解一种特殊的并行技术-展开!

news2024/9/8 23:47:55

在这里插入图片描述
本期文章让我们聊聊一种数字ic设计技术——展开,展开用于产生一个一次迭代就相当于原有结构的多次迭代的新电路结构。其相当于之前聊过的折叠技术的反向操作,折叠使用一个功能单元通过多次迭代来完成原有电路结构一次迭代的操作,相对于通过时间换取面积,而展开则是使用多个功能单元,一次迭代就相当于原有电路结构的多次迭代,相当于通过面积换取时间。

下面让我们开始了解展开这一技术~

一、展开算法

1.1 J倍降速

首先普及一个基础概念,我们将一个能够在一次迭代内,完成原有程序J次迭代的展开过程,其中的J称为展开因子。

当我们对一个程序进行展开时,原有程序路径中的延迟会按照展开因子进行J倍降速(J-slow), 这里的J倍降速指的是:我们原程序进行了J倍的展开,因此在展开后的程序中一个周期的迭代,就相当于原程序的J个周期的迭代,因此如果展开后的路径中有1个延迟单元,假设第k次迭代的输入信号为x(kj+m),其中的m是展开后的节点的编号。那么此时这个延迟单元的输出信号应该是上一次k-1次迭代的结果,即x(j(k-1)+m)=x(kj+m-1*j),也就是说对于展开后的结构来说,它的一个延迟单位的效果相当于原程序J个延迟单元的效果,这就是所谓的J倍降速。

利用J倍降速可以得到展开后的电路结构,举个例子说明一下,假设有以下电路:
在这里插入图片描述
该电路可以使用以下方程进行描述:
在这里插入图片描述
我们对其进行2阶展开,用2k来代替n,因此可以得到以下方程:

在这里插入图片描述
上面两个式子分别是展开后m=0,1的路径方程,结合J倍降速的概念,我们可以发现m=1这条路径上有2个延迟单元,m=0这条路径上有1个延迟单元,于是展开后的电路结构为:
在这里插入图片描述
以上就是利用J倍降速的方式得到展开后的电路结构的流程介绍,不过这种方法还是比较麻烦的,特别是面对较大的J,下面我们再介绍一种更为简单的展开方法。

1.2 图形化的展开方法

我们可以依照下面的步骤利用图形化的方式快速的构建一个展开结构:

对原始结构的每一个节点U,画出J个节点U0,U1,U2,U3…Uj-1。

对原始结构中的每一条带有延迟w的边U->V,画J条带有延迟floor((i+w)/J)的边,这些边从节点Ui指向V(i+w)%J,其中i=0,1,2…J-1。

对于没有延迟的边,可以简化为从节点Ui指向Vi。

接下来,我们通过一个例子来展示上述方法的使用效果:

首先,我们给出上一节中的电路结构的数据流图,如下所示,其中的节点A代表输入,节点B代表加法,节点C代表乘法,节点D代表输出:
在这里插入图片描述
我们采用2倍展开,J=2,因此上述数据流图中的每个节点复制两份,我们主要关注有延迟的边,即节点B到节点C的这条边,使用步骤2,得出它对应的展开:

B0->C1,  延迟为1

B1->C0,  延迟为2

于是展开后的数据流图为:
在这里插入图片描述
可见,这种图形化的展开方法得到的电路结构和上一节中的使用J倍降速得到的电路结构是一致的,我们使用时选取其中一种即可。

二、展开的属性

接下来,让我们了解一下展开的属性,这对我们理解展开技术具有很大的帮助:

对一个电路结构使用展开,不会改变其中的延迟单元(寄存器)数量。

上面的示例就显示了这点,展开前后,电路中的延迟单元数量始终是3个。

对原始电路结构中延迟为w0的环路l进行J阶展开,展开后的电路结构会有gcd(w0,J)(该式表示w0和J的最大公约数)个环路,这些环路中的每个环路都包含了w0/gcd(w0,J)个延迟,以及环路l中出现的每个节点的J/gcd(w0,J)个拷贝。

以展开因子J展开一个迭代边界为T的原始电路结构,会得到一个迭代边界为J*T的J阶展开结构。

因为J阶展开的结构代表了原始结构的J次迭代,那么展开后的系统迭代边界也会扩大J倍,但是由于新的系统可以并行的处理J个样本点,所以采样边界仍然为T,也就是说展开不改变系统的极限吞吐率。

对于原始结构中延迟为w的路径,当w<J时,展开后会得到(J-w)个无延迟的路径,和w个延迟为1的路径。

这个很好理解,从图形化的展开算法中的计算延迟的方法——floor((i+w)/J),即可看出当i<J-w时延迟为0,当J-w<=i<J-1时延迟为1.

由于当w<J时,展开后会得到(J-w)个无延迟的路径,因为没有延迟单元打拍,这些路径的时序可能较差,甚至成为关键路径,因此需要限制J<=w。

任何通过重定时J阶展开的结构的GJ所能得到的可行时钟周期,都可以通过之间对于原始结构的G重定时和以J为展开因子的展开来得到。

这一点是说明展开和重定时之间的顺序不重要,如果可以通过先展开再重定时得到一个电路结构,那么必然也可以通过先重定时再展开得到同样的一个电路结构。

三、展开的应用

通过对展开的属性的理解,不难得到如下的展开应用。

3.1 采样周期的缩短

首先,让我们来讨论展开对系统采样频率提高,缩短采样周期的应用。迭代周期是一个DSP程序的迭代周期的下限,我们无法将DSP程序的迭代周期小于迭代边界。但是我们可以通过展开的应用,将系统的采样周期缩短至迭代边界。

有以下几种情况会使得原始DSP程序的采样周期达不到迭代边界:

  1. 在数据流图中,某个节点的计算时间大于迭代边界时(这里假设该节点不能拆分为两个计算时间更少的子节点)。

  2. 迭代周期不为整数的情况。

  3. 以上两种情况合一,即某些节点的计算时间大于迭代边界,且迭代周期不为整数。

针对以上几种情况,我们可以使用不同展开因子的展开, 通过展开提升采样周期到迭代边界。

首先是针对第一种情况,由于节点的计算时间大于迭代边界,会使得原始结构的采样周期无法等于迭代边界,因此我们可以利用上一节中的展开属性3,即通过展开提升迭代边界T为JT,这样就可以解决节点的计算时间大于迭代边界的限制了。

具体方法是,假设某节点U的计算时间tU大于迭代边界T,那么可以使用展开因子为ceil(tU/T)的展开。

举个例子说明一下:例如下图中原始结构的迭代周期为T=3,其中节点S和T的计算时间为4u.t.,对其进行割集重定时后,最小采样周期为4u.t.,可见采样周期大于迭代边界,因此使用展开因子ceil(tU/T)=ceil(4/3)=2的展开,展开后的结构如右图所示,它的关键路径周期为6u.t.,而迭代边界为JT=6,可见通过展开能够使得DSP程序的采样周期达到迭代边界:

在这里插入图片描述
针对第二种情况,首先需要假设节点的计算时间为整数,由于迭代边界为带小数的单位时间,因此在原始的DSP程序中,不能通过重定时之类的方法使得采样时间等于迭代周期,因此还是利用上一节的属性3,对系统进行展开,即:将迭代边界写成t/w的形式,其中t和w互为素数,接着进行展开因子为w的展开即可。以下是一个例子:
在这里插入图片描述
针对第三种情况,最小的展开因子是能使得迭代边界T,乘上展开因子J后,JT成为整数时的J的最小值。

3.2 并行处理

展开变换的一个直接应用就是从串行处理架构中设计出并行处理架构。在这里我们介绍两种情况——字级和位级并行处理架构。

3.2.1 字级并行处理

首先是字级并行处理架构,我们可以使用展开变换从字串行处理架构设计出字并行处理架构。所谓的字级指的是dsp程序以一个完整的数据(字)为处理单位,每个周期N个数据。

接下来,我们以下面的2阶fir滤波器作为展示:

在这里插入图片描述
上述的fir滤波器每个周期处理一个输入数据x(n),并输出一个输出数据y(n),这就是一个字串行架构。接下来我们以展开因子J=3,产生一个能每个周期并行处理3个数据的字并行架构,按照前面的展开算法所述,我们只需要注意有延迟的边的情况,即:

A0->D1, 延迟为0

A1->D2, 延迟为0

A2->D0, 延迟为1

D0->E1, 延迟为0

D1->E2, 延迟为0

D2->E0, 延迟为1

除了上述的边外,其他的边直接相连,可以得到以下的3阶fir并行结构,该结构能每个周期处理3个输入数据,从而大大提升了采样周期:
在这里插入图片描述

3.2.2 位级并行处理

位级处理结构就是以位为标准处理单位,每个周期处理N个位。利用展开算法,我们可以从位级串行结构中,得到位并行和数字串行架构,这些架构的定义如下所述,首先假设W为数据的字长。

  • 位串行处理:一个时钟周期处理一位数据,一个完整的字在W个周期内处理完成。

  • 位并行处理:一个W位的字在一个时钟周期内处理完成。

  • 数字串行处理:一个时钟周期处理N位,一个字在W/N个时钟周期倍处理完成。参数N称为数字尺寸。

  • 在这里插入图片描述
    于串行数据来说,由于不能在一个周期内处理完,我们需要考虑数据的进位处理,即我们需要使用开关(选择器)来对输入数据进行选择,例如:对于加法器来说,可以在bit0时无需进位,在其他位时需要进位,所以对于位级串行结构的展开来说,重点是开关(选择器)的展开,这一过程如下所示:

首先,我们做出如下两个假设:

  • 字长W是展开因子J的倍数,即W=W’J。

  • 所有进出开关的边都不含延迟。

其实如果包含了延迟单元也没关系,我们可以假设在这条边的延迟单元和选择器之间有个虚节点,在完成展开后,再消除这些虚节点即可。

接下来,我们按照以下两步对节点进行展开:

  1. 将开关的闭合写为:

在这里插入图片描述
这里的l为迭代次数,u=0,1,2,3…W-1,也就是一次迭代的子周期数。

  1. 在展开后的图中,结合上式,从节点Uu%J到节点Vu%J画一条不带延迟的边,它在W’l + floor(u/J)时刻闭合。

此外,我们还需要注意一点,展开包含开关的电路将不再保留延迟。

下面通过一个例子说明上述算法,假设有字长W=4的串行加法器:
在这里插入图片描述
首先,我们可以观察到,该串行加法器会在迭代的子周期u=0选择进位为0,其他时候选择进位为延迟单元的输出,我们以展开因子为2进行展开,所以有W’=2,设加法器的输入节点为A和B,输出为S,加法器为节点X,并且在延迟单元和开关之间设置一个虚节点D,0处的输入节点设为Z,a,首先还是按照展开算法,画出加法器节点X到虚节点D之间的关系:

X0->D1, 延迟为0

                               X1->D0,  延迟为1                                   

然后,画出开关的关系式:

4l+0=2(2l+floor(0/2))+(0%2)=2(2l+0)+0

4l+1=2(2l+floor(1/2))+(1%2)=2(2l+0)+1

4l+2=2(2l+floor(2/2))+(2%2) =2(2l+1)+0

4l+3=2(2l+floor(3/2))+(3%2)=2(2l+1)+1

于是可知:

Z0->X0, 在2l+0时刻闭合

D1->X1, 在2l+0时刻闭合

D0->X0, 在2l+1时刻闭合

D1->X1, 在2l+1时刻闭合

由于迭代周期为2,因此可知D1到X1之间始终闭合,因此可以去除选择器,于是有以下的并行展开结构:

在这里插入图片描述
最后,我们去掉虚节点和死节点,可以得到如下的加法器电路:

在这里插入图片描述
以上就是位级串行处理结构展开为数字尺寸为2的数字串行处理结构的例子。接下来让我们再举一个位级串行处理结构展开为位级并行结构的例子,还是上述的加法器,区别在于本次将展开因子设置为4,于是有以下的展开结构:

在这里插入图片描述
观察一下可以发现D0是虚节点也是死节点,因此延迟会被一起去掉,所以最终的电路没有延迟了,即:
在这里插入图片描述
四、总结

以上就是对展开技术的介绍了,利用展开,我们可以对存在环路的电路进行并行化,这对提升电路效率,缩短采样周期有很大的帮助。

以下是往期的内容链接,欢迎阅读哟~

ic进阶|性能篇01:ic设计中的重定时到底是什么?一文带你了解重定时的原理!(qq.com)

ic进阶|面积篇01:改善面积的神器–折叠技术!以fir滤波器为例带你了解折叠技术!(qq.com)

ic基础|时钟篇05:芯片中buffer到底是干嘛的?一文带你了解buffer的作用 (qq.com)

ic基础|存储器篇02:cache的写机制-Write-through与Write-back是什么 (qq.com)

ic基础|存储器篇01-芯片中的信息存储单元有哪些?一文带你了解芯片中的存储器!(qq.com)

如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

访问控制列表(ACL)

文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List&#xff0c;访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…

USB3.0的等长要求到底是多少?

USB2.0与USB3.0接口的PCB布局布线要求PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 90欧姆阻抗&#xff0c;走差分线&#xff1a; 重点来了&#xff1a;

cf场+线性dp

Problem - B - Codeforces 思路&#xff1a; 这其实是一道数学题&#xff08;最开始一直在枚举&#xff0c;服啦&#xff09; 我们的目的是求最大利润 当a>b是时直接令k0,利润n*a即可 当a<b时存在两种情况&#xff1a; 1.b-a>n即所有b-i1的情况都>a&#xff0…

【数据结构】哈希表二叉搜索树详解

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f341;1. 二叉搜索树 二叉搜索树也称为二叉查找树或二叉排序树&#xff0c;是一种特殊的二叉树结构&#xff0c;它的特点是&#xff1a; 1. 若左树不为空&am…

SCI算法!发文首选!参数优化下的BiLSTM-KAN模型回归预测,Python代码

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ KAN是2024年最新的算法&#xff0c;是近期非常热门的一…

leetcode112. 路径总和 leetcode113. 路径总和II,图文并茂,教你完全弄懂DFS,附详细代码

leetcode112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …

实验2-3-8 计算火车运行时间

//实验2-3-8 计算火车运行时间 /* 输入格式&#xff1a;输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。 每个时间的格式为2位小时数&#xff08;00-23&#xff09;和2位分钟数&#xff08;00-59&#xff09;&#xff…

从0到1,AI我来了- (4)AI图片识别的理论知识-II

上篇文章&#xff0c;我们理解了我们程序的神经网络设计&#xff0c;这篇我们继续&#xff0c;把训练迭代过程分析一下&#xff0c;完成这两篇文章&#xff0c;下面问题&#xff0c;应该能回答了。 一张图片&#xff0c;如何被计算机读懂&#xff1f;pytorch 封装的网络&#…

C语言实现K均值聚类

K均值聚类(K_means)基础理论 K_means聚类是一种简单且广泛使用的聚类算法&#xff0c;它旨在将数据集中的样本划分为k个不同的聚类&#xff0c;其中k是事先指定的聚类数量&#xff0c;该算法的核心思想是迭代地优化聚类中心&#xff0c;以最小化每个样本与其所属聚类中心之间的…

数据仓库中的DIM层-定义、设计与最佳实践

在当今数据驱动的商业环境中,构建高效的数据仓库架构至关重要。本文将深入探讨数据仓库中的维度层(DIM层),帮助您了解其定义、重要性以及设计最佳实践。 目录 什么是DIM层?DIM层的重要性DIM层设计最佳实践1. 选择适当的粒度2. 实施慢速变化维度(SCD)3. 使用代理键4. 规范化v…

x264编解码库 -介绍和使用示例

目录 1&#xff1a;X264简单介绍 1.1&#xff1a;编译x264 1.2&#xff1a;x264简单介绍 1.3&#xff1a;x264的优势 1.4&#xff1a;x264与FFmpeg的关系 1.5&#xff1a;x264 编解码原理 1.6 进一步学习资源 2&#xff1a;demo效果 3&#xff1a;完整代码 4&#xff1a;附件…

Vite + Vue3 + TS项目配置前置路由守卫

在现代前端开发中&#xff0c;使用 Vue 3 和 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具&#xff0c;可以显著提升开发体验。本文博主将指导你如何在 Vite Vue 3 TypeScript 项目中配置前置路由守卫&#xff08;Navigation Guards&#xff09;…

学习日记:数组

1. 概念 一组相同类型的数据的集合&#xff0c;也是一种数据类型。 2. 一维数组 2.1 语法 类型说明符 数组名 [常量表达式] &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;1&#xff09;类型说明符&#x…

Leetcode - 周赛407

目录 一&#xff0c;3226. 使两个整数相等的位更改次数 二&#xff0c;3227. 字符串元音游戏 三&#xff0c;3228. 将 1 移动到末尾的最大操作次数 四&#xff0c;3229. 使数组等于目标数组所需的最少操作次数 一&#xff0c;3226. 使两个整数相等的位更改次数 本题可以暴力…

刷题了:144.二叉树的前序遍历心|145.二叉树的后序遍历心|94.二叉树的中序遍历己

递归遍历 文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF 视频讲解:https://www.bilibili.com/video/BV1Wh411S7xt/?spm_id_from333.788&vd_sourcee70917aa6392827d1ccc8d85e1…

ubuntu20.04安装nginx,mysql8,php7.4详细教程,包成功

目录 1.更新索引 2.安装 Nginx 1.安装 Nginx&#xff1a; 2.启动 Nginx 服务并设置为开机自启&#xff1a; 3.开放防火墙的 80 端口&#xff1a; 4.检查 Nginx 是否正常运行&#xff1a; 3.安装 MySQL 8.0 1.首先&#xff0c;安装 MySQL 的仓库&#xff1a; 安装过程中你会看…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

TinyVue 组件库官网焕然一新!

本文由体验技术团队Kagol原创~ 之前有一些朋友吐槽我们 TinyVue 组件库的 UI 不够美观&#xff0c;于是我们请了设计师小姐姐给我们的组件和网站进行优化&#xff0c;经过设计师小姐姐和我们的开发兄弟们一个多月的努力&#xff0c;终于完成网站第一版的优化。 优化点 主要优…

学习react-登录状态验证

1.创建三个页面LoginPage, HomePage,NotFoundPage用于Router 创建LoginPage.tsx用于做登录页面 // LoginPage.tsx const LoginPage (props:LoginProp) > {const navigate useNavigate();return( <h1 onClick{ ()>{navigate("/");}}>Hello Login, {pr…

如何在Selenium Webdriver中点击SVG元素?

我们将在URL上单击下面突出显示的SVG元素&#xff1a;https&#xff1a;//testkru.com/Elements/SVGelemnts。 有几种方法可以点击SVG元素&#xff0c;我们将在这篇文章中讨论它们&#xff0c;并讨论它们之间应该首选哪一种。 使用 WebElement Click() 通过使用Action Click() …