hls任务级编程第一篇文章可看这里:
hls之任务级并行编程
hls的任务级并行性(task-level parallelism)分为两种:一种是控制驱动型;一种是数据驱动型。对于控制驱动型,用户要手工添加dataflowpragma,工具会在该pragma指定的区域内判别任务之间的并行性,生成各进程之间的模块级控制信号。对于数据驱动型,用于需要明确指定可并行执行的任务。
从描述手段来看,控制驱动型本质上是由工具判定各任务能否并行执行。用户在对各函数描述时只要遵守dataflow的要求即可。例如:读取输入数据应该位于dataflow区域的起始位置,写入输出数据应位于该区域的终止位置。datalow区域内的所有变量遵循“一次读一次写”原则。除非使用hls::stream,否则不支持反馈支路。不支持在指定条件下才执行函数。不支持for在指定条件下退出(使用break语句)。但控制驱动型比较灵活,这是因为dataflow的作用对象可以是for循环也可以是函数。控制驱动器适合于顺序执行的c函数。控制驱动型模型带来的好处包括:当前函数在结束执行之前后续函数可以开始执行;函数在结束执行之前可以重新开始执行;两个或更多顺序函数可以同时开始执行。我们看一个例子。如下图所示,顶层函数diamond调用了4各函数funca~funcd。
在没有添加dataflow的情况下,工具能自动探测出funcb和funcc的并行性,这可从schedule视图中看到,如下图所示。
添加dataflow之后,对两者性能进行对比,如下图所示(no_tlp为没有添加dataflow的solution),从latency角度看,两者相当,但从interval角度看,dataflow带来的效果还是很明显的。interval从457降到了175。
再看数据驱动型。数据驱动型要求任务之前以stream作为接口,允许反馈支路。用户需要明确通过hls::task指定可并行执行的任务。对于上述函数,我们可以将其改造为数据驱动型,如下图所示。代码第98行声明了4个stream,第99行~第102行通过hls::task指定并行任务。
将三者放在一起对比,如下图所示。可以看到数据驱动型无论在性能还是资源上都获得最佳表现。
那么两种类型能否混合使用呢?答案是肯定的,但是有限制的,这源于两者的自身特征。可以在控制驱动型中嵌入数据驱动型,但反过来是不允许的。我们将上面的例子改造为控制驱动型嵌入数据驱动型的模式,如下图所示。这里需要注意的是代码第137行的dataflowpragma,同时代码第141行和第142行都设置了task,task接口为stream。此外也给出了vitis hls的schedule视图和dataflow视图。dataflow视图中也显示了kpn。关于kpn可参阅这里。
https://en.wikipedia.org/wiki/kahn_process_networks
中软国际与百度双方携手共建“平台+服务”生态
扫地机器人产业市场发展现状分析
华为云CDN加速,如何让峰值流量屡创新高?
高级16位数字信号控制器dsPIC33F的主要特性及应用电路
我国多地加强人工智能产业发展 日本智能电网建设取得新进展
基于HLS之任务级并行编程
在隐形眼镜上能否放置一个微型显示屏
小米6最新消息:小米官方已默认小米6重启问题,希望用户等待米6的系统更新
Max Pooling算子的设计实现
RISC-V MCU gp全局指针说明
a javascript error怎么修复
一文带你了解5G技术的发展与应用
炫彩音质,尽情脉动 JBL PULSE4 音乐脉动四代便携式蓝牙音箱
生物识别技术的应用现状_生物识别发展趋势
电压驻波比测量
模型的带宽对信号眼图有什么影响?
重庆汽车电子再增新生力量
HDR显示器缺陷太多 暂时还不值得入手
电子油门,电子油门是什么意思
通用型粉尘检测仪JCF-5H的使用方法和注意事项