HLS优化设计中pipeline以及unroll指令:细粒度并行优化的完美循环_第1页
HLS优化设计中pipeline以及unroll指令:细粒度并行优化的完美循环_第2页
HLS优化设计中pipeline以及unroll指令:细粒度并行优化的完美循环_第3页
HLS优化设计中pipeline以及unroll指令:细粒度并行优化的完美循环_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HLS优化设计中pipeline以及unroll指令:细粒度并行优化的完美循环

HLS优化设计的最关键指令有两个:一个是流水线(pipeline)指令,一个是

数据流(dataflow)指令。正确地使用好这两个指令能够增强篁法地并行性,提

升吞吐量,降低延迟但是需要遵循一定的代码风格。展开(unroll)指令是只

针对for循环的展开指令,和流水线指令关系密切,所以我们放在一起首先我

们来看一下这三个指令在Xilinx官方指南中的定义:

Unroll:Unrollfor-loopstocreatemultipleinstancesoftheloop

bodyanditsinstructionsthatcanthenbescheduledindependently.

Pipeline:Reducestheinitiationintervalbyallowingtheoverlapped

executionofoperationswithinalooporfunction.

Dataflow:Enablestasklevelpipelining,allowingfunctionsandloops

toexecuteconcurrently.Usedtooptimizethroughoutputand/or

latency.

Unroll指令在for循环的代码区域进行优化,这个指令不包含流水线执行的

概念,单纯地将循环体展开使用更多地蝮性资源实现,保证并行循环体在调度

地过程中是彼此独立的。

Pipeline指令在循环和函数两个层级都可以使用,通过增加重复的操作指令

(如增加资源使用量等等)来减小初始化间隔。

Dataflow指令是一个任务级别的流水线指令,从更高的任务层次使得循环或函

数可以并行执行,目的在于减小延迟增加吞吐量。

Unroll和Pipeline由令相互重合的关系在于,当对函数进行流水线处理时,

以下层次结构中的所有循环都会自动展开,而使用展开指令的循环并没有给定

对H的约束。在最新版本的VitisHLS工具中,工具会自动分析数据之间的

流水线操作关系,以11=1为目标优化,但是还是会受限于设计本身的算法和

代码风格。下图非常清晰地阐明了Unroll和Pipeline指令的关系,

Pipeline指令放置的循环层次越高,循环展开的层次也越高,最终会导致使用

更大面积的资源去实现,同时并行性也更高。

voidfoo(inl(HJ,m2(l[],..){voidfoo(inHH].^2[][],...){

L1:for(l=1;i<N>*){L1:for(i=l;l<N;lw){

L2:for(j=O,j<Mj^){♦pragmaAPPIPELINE

#pragmaAPPIPELINEL2:for(j=O;j<M;)^){

out(i]0]-♦ln2[i]U];out(i)0]=in1[i]g]*in2[i]g],

))

})

))

ladder,3accessesUnrollsL2

Madders,3Maccesses

这里如果循环的边界是变量的话,则无法展开。这将组织函数被流水线化,可

以通过添加tripcount等指令,指定循环在综合时大概的最大最小边界。

在循环流水线优化的过程中,有一个完美循环,半完美循环和非完美循环的代

码风格概念,只有当流水线循环完美或半完美时,才可以将嵌套循环彻底并行

展开。

完美循环:只有最里面的循环才具有主体内容,在循环语句之间没有指定逻

辑,循环界限是恒定的。

半完美循环:只有最里面的循环才具有主体(内容),在循环语句之间没有指定

逻辑,只有最外面的循环边界可以是可变的。

非完美循环:循环的主体内容分布在循环的各个层次或内层循环的边界是变

量。

PerfectloopnestSemi-PerfectloopnestImperfectloopnest(1:

opouter

loop.outer:oop.out":

for(1«•;1or(1■

ConstantIVdOdblrCoristaiil

far

iCanstanlIIOOPBODY

当我们要争去最大流水线循环的成功执行,就需要将非完美循环手动修改成完

美或半完美循环。以下代码例子给出了完美循环(左边)和非完美循环(右

边)在VitisHLS中的执行结果。

Perfectjoop

*include-loopperfect.h*

voidloopperfect(dintA[N],dout_tB[N]){

intij;voidloopimperfect(dintA[N],douttB[N]){

dinttacc;

intij;

LOOP_l:for(i=0;i<20;i++){dinttacc;

LOOPJ:for(j=O;j<20;j++){LOOP_l:for(i=0;i<20;i++){

if(j==O)acc=0;

acc=0;

acc+=A[j]*j;

if(j==19)(LOOPJ:for(j=O;j<20J++){

if(i%2==0)acc+=A[j]*j;

B[i]=acc/20:

}

else

if(i%2==0)

B[i]=0:

)B[i]=acc/20;

)else

)

B[i]=0;

♦Timing:♦Timing:

,Summary:♦Summary:

IClock|Target|E$ilmated|Uncertainty||ClockITarget|EstimatedIUncertainty!

|ap_clk|25.00n5|2.505n5|6.75n5|lap.clk|25.00ns|2.505ns|6.75ns|

*・♦・・・••・♦•・・・・・・••・・•.■•・・-a

♦LMemvUM^ey

•Surnrrnry

IL*iercy(cvcWt)|latercy|c:,、*|Pgne|ILMrr*ry|ryrit5>|IIrrcoHPECe|

Imr|ZK|mln|ma||trlr|m・|Type|Inwn|nvtM||z.|E、|-a|,YX|

|40f|102CCU5lOZCOg4O9|409none|IMl|Ui|im,|US25«a|R|5t2|e・|

•DM♦W

•LOOP:

LOOP:

IJS・G4必。IItetrkr.MdleuiM|TreII

IIMercyicyde^i|hermcr*ftt为mmtr-v*||Iloop|F。ma<|-y|SM-d|MrfH|d|力msE

loopNirwIEM|rwM|l»wcvI,滴|>.«:ICount|^ptlkwdl

I-LOOPJ|M3I、eo-I20|2

LOOr.l.LOOPJ|406|石«|1|1|400|VM||•IOC*_>|2>|U|S|1|20Ml

IName|RAM_W|0""|IS|UMM|IMmeIDW”IM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论