三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

吞吐量最优化设计

吞吐量最优化设计

一、吞吐量最优化概念
1.dataflow
2.pipeline
3.unroll
4.throughput


二、吞吐量(Throughput)定义和指标
1.吞吐量作为设计的关键指标
优化吞吐量主要靠并行化和减少空闲时间周期。
2.流水线设计和数据流设计是提高throughput的关键方式
3.吞吐量(Throughput) 通常指设计单位时间内能处理的数据量或任务数
最直接的衡量指标是 启动间隔(Initiation Interval, II) ——即两次新输入之间所需的时钟周期数。理想的 II=1 意味着每个时钟周期都能接收新数据,吞吐量最高。


三、流水线化设计
1.流水线设计是将复杂的设计拆成多个简单的步骤或者阶段进行
多个处理阶段可以重叠进行,从而减少完成一个数据蔡启动下一个的串行等待;
2.pipeline的目标是要追求II=1
优化方式:
打破依赖:去除循环间的数据依赖(RAW 依赖)。例如用局部变量暂存中间结果,或改写算法避免迭代间数据复用。

load & store分离:将读写分成现态和次态分别处理,从而规避依赖;

数组分割 — #pragma HLS ARRAY_PARTITION:将大数组拆成多个小块或寄存器,增加存储器端口,保证流水线每个周期都能独立读写。

数组copy复用--将同一份数据内容拷贝赋值到多个数组中去使用

循环展开 — #pragma HLS UNROLL:部分或完全展开循环,以更多硬件资源换取并行性,减小 II。若完全展开,循环将变成全并行组合逻辑,吞吐量极高但面积暴增。

循环扁平化 — #pragma HLS LOOP_FLATTEN:将嵌套循环合并为单层循环,使最内层循环获得更大的流水线优化空间。

3.pipeline的目标只能到II=2
这个时候需要的方式,就是连续读取2个节拍数据,然后进行处理,这样即使II=2,但是同一个流程处理了两个并行度,最终II等效为1.


四、loop_tripcount设计

for(int i=0;i<100;i++){}

for(int i=0;i<100;i=i+2){}
vivado hls中loop_tripcount表示的含义,如果索引i按照1自增和i按照2自增,loop_tripcount应该是多少?

对于这两个循环:

**for(int i=0;i<100;i++){}
循环从i=0开始,每次i增加1,直到i<100
i的取值:0, 1, 2, …, 99
总共执行100次
loop_tripcount = 100
**for(int i=0;i<100;i=i+2){}
循环从i=0开始,每次i增加2,直到i<100
i的取值:0, 2, 4, …, 98
计算方法:(98-0)/2 + 1 = 49 + 1 = 50次
loop_tripcount = 50
因此:

第一个循环的loop_tripcount是100
第二个循环的loop_tripcount是50

// 对于 i++ 的循环
#pragma HLS loop_tripcount min=100 max=100 avg=100

// 对于 i=i+2 的循环
#pragma HLS loop_tripcount min=50 max=50 avg=50

五、吞吐量计算
1.HLS高层次综合中衡量的核心指标是
启动间隔II

时钟频率Frequency

2.基于II和数据率的计算公式
对于流式数据处理,吞吐量计算公式为:
Throughput = fclk/II;
其中,fclk综合后时序的时钟频率,单位是HZ;
II:两次新输入之间所需的最小时钟周期数,可从综合报告中直接读出。

若时钟频率 200 MHz,循环 II=2,则该循环的数据吞吐率为 100 MSamples/s。若优化为 II=1,则吞吐率翻倍至 200 MSamples/s。

← 返回列表