购物网站制作实例,开外贸公司的流程及费用,苏州seo网站推广,网站建设需求方案文档硬件的核心是并行编程#xff0c;它主要包括两大部分#xff1a;多流水并行、流水内部打拍。
1 多流水并行编程是在硬件内部形成多条流水#xff0c;和cpu多个核心 类似#xff0c;但是数量可以远远超过cpu核数#xff0c;一般实现方案有两种#xff1a;fifo和ram
1) f…硬件的核心是并行编程它主要包括两大部分多流水并行、流水内部打拍。
1 多流水并行编程是在硬件内部形成多条流水和cpu多个核心 类似但是数量可以远远超过cpu核数一般实现方案有两种fifo和ram
1) fifo:将执行流程拆解成多个模块模块间通过fifo连接起来每个模块独立一个流水模块的运行受控于fifo是有数据和控制命令。这块有点像软件的多线程通过无锁队列传输数据的方式。
2) ram:是一个模块将数据写入 另外一个模块读出处理这个方式的优势是可以一个生产者、多个消费者处理数据。难点在于通知机制和模块间同步一般可以用fifo传递信号。
总体来说fifo的方式一般够用ram的方式用的场景比较少
2 流水内部打拍是指在一个模块内部运行流程周期是M周期如果需要执行N次那么总时延是M*N但是如果流水内部运行流程拆解成多个步骤每个步骤1拍完成既拆成M个步骤然后设计的时候能保证第X步骤生成的中间值在后续步骤使用是不被破坏就可以每拍启动一次这样的好处是执行N次的时间是 MN-1次。
流水打拍严格被循环条件控制循环不能提前break而且运行过程中循环条件不能在执行过程中修改也就是说一但启动流水打拍只能在流水打拍外部控制是否可以结束内部无法通过beark或修改循环条件方式控制提前结束这个是个很苦恼的问题也是在使用流水打拍不很爽的地方
流水内部打拍设计有两个难点如何将步骤拆解成1拍完成产生的中间值后面使用不被后续打拍破坏
1) 步骤拆解成1拍主要遇到的问题是原子操作的拆解比如128b*128b的乘法如果是组合电路1拍很难满足。所以需要设计算法拆解。当然也可以2拍来打拍但是时延将会变成M2N-2成倍数上升。
2产生的中间值后面使用不被后续打拍破坏一般做法有两种将中间变量做成数组数组的长度不小于步骤数通过多次寄存器赋值实现。例子如下
int a,b,c,d;
step1: ba;
step2: cb;
step3: dbc;
上述例子如果流水打拍会出现以下场景按照a1、2、3、4
初始状态a1b0c0d0
一拍后 a2b1c0d0
二拍后 a3b2c1d0
三拍后 a4b3c2d21
四拍后 a5b4c3d32
而我们想要的是第一个结果是 d11第二个是d22....
改造方案1(待验证
int a,b,c,d; int b1;
step1: ba;
step2: cb; b1b;
step3: db1c;
初始状态a1b0c0d0, b10
一拍后 a2b1c0d0, b10
二拍后 a3b2c1d0, b11
三拍后 a4b3c2d11,b12
四拍后 a5b4c3d22,b13
这样就做到我们想要的结果了 改造方案2
int a[3],b[3],c[3],d;
step1: b[i%3]a[i%3];
step2: c[i%3]b[i%3];
step3: db[i%3]c[i%3];
初始状态a[0]1b[0]0c[0]0d0 a[1]0b[1]0c[1]0d0 a[2]0b[2]0c[2]0d0
一拍后 a[0]1b[0]1c[0]0d0 a[1]2b[1]0c[1]0d0 a[2]0b[2]0c[2]0d0
二拍后 a[0]1b[0]1c[0]1d0 a[1]2b[1]2c[1]0d0 a[2]3b[2]0c[2]0d0
三拍后 a[0]4b[0]1c[0]1d11 a[1]2b[1]2c[1]2d11 a[2]3b[2]3c[2]0d11
四拍后 a[0]4b[0]4c[0]1d22 a[1]5b[1]2c[1]2d22 a[2]3b[2]3c[2]3d22
五拍后 a[0]4b[0]4c[0]4d33 a[1]5b[1]5c[1]2d33 a[2]6b[2]3c[2]3d33
这样分别在第3拍、4拍、5拍获取到正确的值 方案1
优点消耗资源少对于每个步骤少并且明确是几拍的非常有效
缺点对于步骤多复杂的场景影响大而且一旦步骤变化需要重新计算大于一拍打拍比较难处理
方案2
优点是结构简单对于步骤变化不敏感只要数组的长度不小于步骤数支持大于1拍打拍缺点浪费资源