0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析HLS的任务级并行性

FPGA技术驿站 来源:FPGA技术驿站 2023-07-27 09:21 次阅读

HLS的任务级并行性(Task-level Parallelism)分为两种:一种是控制驱动型;一种是数据驱动型。对于控制驱动型,用户要手工添加DATAFLOWpragma,工具会在该pragma指定的区域内判别任务之间的并行性,生成各进程之间的模块级控制信号。对于数据驱动型,用于需要明确指定可并行执行的任务。

从描述手段来看,控制驱动型本质上是由工具判定各任务能否并行执行。用户在对各函数描述时只要遵守DATAFLOW的要求即可。例如:读取输入数据应该位于DATAFLOW区域的起始位置,写入输出数据应位于该区域的终止位置。DATALOW区域内的所有变量遵循“一次读一次写”原则。除非使用hls::stream,否则不支持反馈支路。不支持在指定条件下才执行函数。不支持for在指定条件下退出(使用break语句)。但控制驱动型比较灵活,这是因为DATAFLOW的作用对象可以是for循环也可以是函数。

控制驱动器适合于顺序执行的C函数。控制驱动型模型带来的好处包括:当前函数在结束执行之前后续函数可以开始执行;函数在结束执行之前可以重新开始执行;两个或更多顺序函数可以同时开始执行。我们看一个例子。如下图所示,顶层函数diamond调用了4各函数funcA~funcD。

557fca60-2c11-11ee-a368-dac502259ad0.png



在没有添加DATAFLOW的情况下,工具能自动探测出funcB和funcC的并行性,这可从Schedule视图中看到,如下图所示。

5592c2be-2c11-11ee-a368-dac502259ad0.png



添加DATAFLOW之后,对两者性能进行对比,如下图所示(NO_TLP为没有添加DATAFLOW的solution),从Latency角度看,两者相当,但从interval角度看,DATAFLOW带来的效果还是很明显的。Interval从457降到了175。

55a328e8-2c11-11ee-a368-dac502259ad0.png



再看数据驱动型。数据驱动型要求任务之前以stream作为接口,允许反馈支路。用户需要明确通过hls::task指定可并行执行的任务。对于上述函数,我们可以将其改造为数据驱动型,如下图所示。代码第98行声明了4个stream,第99行~第102行通过hls::task指定并行任务。

55b74472-2c11-11ee-a368-dac502259ad0.png



将三者放在一起对比,如下图所示。可以看到数据驱动型无论在性能还是资源上都获得最佳表现。

55ccb1ae-2c11-11ee-a368-dac502259ad0.png

那么两种类型能否混合使用呢?答案是肯定的,但是有限制的,这源于两者的自身特征。可以在控制驱动型中嵌入数据驱动型,但反过来是不允许的。我们将上面的例子改造为控制驱动型嵌入数据驱动型的模式,如下图所示。这里需要注意的是代码第137行的DATAFLOWpragma,同时代码第141行和第142行都设置了task,task接口为stream。此外也给出了Vitis HLS的Schedule视图和Dataflow视图。Dataflow视图中也显示了KPN。

55e44418-2c11-11ee-a368-dac502259ad0.png

5605458c-2c11-11ee-a368-dac502259ad0.png

5614649a-2c11-11ee-a368-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7310

    浏览量

    142972
  • 控制驱动器
    +关注

    关注

    0

    文章

    2

    浏览量

    5714
  • HLS
    HLS
    +关注

    关注

    1

    文章

    126

    浏览量

    23683

原文标题:再谈HLS之任务级并行编程

文章出处:【微信号:Lauren_FPGA,微信公众号:FPGA技术驿站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于HLS任务并行编程

      HLS任务级编程第一篇文章可看这里: HLS任务并行编程 HLS
    的头像 发表于 07-27 09:22 796次阅读
    基于<b class='flag-5'>HLS</b>之<b class='flag-5'>任务</b>级<b class='flag-5'>并行</b>编程

    Python中的并行性和并发性分析

      在Python编程语言当中,很多人对Python中的并行性和并发性不了解。今天我们将讨论python中的并发和并行性www.zpedu.com。在这里,我们将研究Python的多线程,多处
    发表于 08-21 17:45

    阻止任务级别并行性的常见情况

    粗粒度并行优化的任务流水阻止任务级别并行性的常见情况
    发表于 03-09 06:58

    浅析java异步回调和同步回调

    CompletableFuture为什么它在依赖于不同的异类异步执行任务的交互的编程系统中如此有用?以及它如何补充fork / join样式的并行性
    发表于 10-19 07:13

    HLS-1Hin人工智能训练系统

    连接器)。外部以太网链路可以连接到任何交换层次结构。Suchconfiguration可以进行优化,以大规模实现textra大型模型并行性,并可以轻松处理数据并行性或模型和数据并行性的组合。 GAUDI
    发表于 08-04 06:06

    算法隐含并行性的物理模型

    算法隐含并行性的物理模型:利用物理学原理对算法的隐含并行性进行了分析,提出算法的不确定性和高熵态是隐含并行性出现的根源,但算法的隐含并行性会导致算法结果的不确定
    发表于 10-21 08:23 10次下载

    英特尔架构中的多线程优化和扩展并行性的编程技术

    有效并行缩减和扩展并行性的编程技术。
    的头像 发表于 11-01 06:24 1986次阅读

    矢量化数据并行性的程序方面的作用

    矢量化在加速具有算法固有的数据并行性的程序方面起着至关重要的作用。 英特尔C ++编译器提供了显式的矢量编程方法,以提高性能。
    的头像 发表于 11-06 06:31 1933次阅读

    有关 Dataflow 指令的原理

    在本文中,我们将重点放在如何能够在不需要特殊的库或类的情况下修改代码风格以实现C代码实现并行性。Xilinx HLS 编译器的显着特征是能够将任务级别的并行性和流水线与可寻址的存储器
    的头像 发表于 02-09 10:34 1079次阅读

    如何在不需要特殊库或类的情况下实现C代码并行性?

    提取实现任务级 (task_level) 的硬件并行算法是设计高效的HLS IP内核的关键。 在本文中,我们将重点放在如何能够在不需要特殊的库或类的情况下修改代码风格以实现C代码实现并行性
    的头像 发表于 02-11 11:05 1238次阅读
    如何在不需要特殊库或类的情况下实现C代码<b class='flag-5'>并行性</b>?

    Unroll & Pipeline | 细粒度并行优化的完美循环

    HLS 优化设计的最关键指令有两个:一个是流水线 (pipeline) 指令,一个是数据流(dataflow) 指令。正确地使用好这两个指令能够增强算法地并行性,提升吞吐量,降低延迟但是需要遵循一定的代码风格。
    发表于 02-01 06:28 7次下载
    Unroll & Pipeline | 细粒度<b class='flag-5'>并行</b>优化的完美循环

    Dataflow | 粗粒度并行优化的任务级流水

    在本文中,我们将重点放在如何能够在不需要特殊的库或类的情况下修改代码风格以实现C代码实现并行性。Xilinx HLS 编译器的显着特征是能够将任务级别的并行性和流水线与可寻址的存储器
    发表于 03-02 06:19 12次下载
    Dataflow | 粗粒度<b class='flag-5'>并行</b>优化的<b class='flag-5'>任务</b>级流水

    研讨会:如何利用最新Vitis HLS提高任务并行性

    当前在 AI、无线、视频/图像处理、医疗和消费领域使用的算法,复杂性已显著提升。 Vitis  高层次综合 (HLS) 可通过在选定的 AMD 器件上将 C/C++ 代码综合为可编程逻辑的 RTL
    的头像 发表于 07-05 08:15 308次阅读
    研讨会:如何利用最新Vitis <b class='flag-5'>HLS</b>提高<b class='flag-5'>任务</b>级<b class='flag-5'>并行性</b>?

    Vitis HLS相关问答详解

    需要手工在 C++ 代码里明确指定可并行执行的任务(用 task,添加头文件 hls_task.h),同时可并行执行的 task 接口(对应 C++ 函数的形参)必须是 stream
    的头像 发表于 08-11 11:23 409次阅读

    Vitis HLS:使用任务并行性的高性能设计

    电子发烧友网站提供《Vitis HLS:使用任务并行性的高性能设计.pdf》资料免费下载
    发表于 09-13 17:21 0次下载
    Vitis <b class='flag-5'>HLS</b>:使用<b class='flag-5'>任务</b>级<b class='flag-5'>并行性</b>的高性能设计