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

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

3天内不再提示

关于pipeline 以及 unroll 指令的介绍

电子设计 来源:电子设计 作者:电子设计 2022-02-09 09:53 次阅读

本文转载自: XILINX开发者社区微信公众号

HLS 优化设计的最关键指令有两个:一个是流水线 (pipeline) 指令,一个是数据流(dataflow) 指令。正确地使用好这两个指令能够增强算法地并行性,提升吞吐量,降低延迟但是需要遵循一定的代码风格。展开 (unroll) 指令是只针对 for 循环的展开指令,和流水线指令关系密切,所以我们放在一起首先我们来看一下这三个指令在 Xilinx 官方指南中的定义:

Unroll: Unroll for-loops to create multiple instances of the loop body and its instructions that can then be scheduled independently.

Pipeline:Reduces the initiation interval by allowing the overlapped execution of operations within a loop or function.

Dataflow:Enables task level pipelining, allowing functions and loops to execute concurrently. Used to optimize through output and/or latency.

Unroll 指令在 for 循环的代码区域进行优化,这个指令不包含流水线执行的概念,单纯地将循环体展开使用更多地硬件资源实现,保证并行循环体在调度地过程中是彼此独立的。

Pipeline 指令在循环和函数两个层级都可以使用,通过增加重复的操作指令(如增加资源使用量等等)来减小初始化间隔。

Dataflow 指令是一个任务级别的流水线指令,从更高的任务层次使得循环或函数可以并行执行,目的在于减小延迟增加吞吐量。

Unroll 和 Pipeline 指令相互重合的关系在于,当对函数进行流水线处理时,以下层次结构中的所有循环都会自动展开,而使用展开指令的循环并没有给定对II的约束。在最新版本的 Vitis HLS 工具中,工具会自动分析数据之间的流水线操作关系,以II=1为目标优化,但是还是会受限于设计本身的算法和代码风格。下图非常清晰地阐明了Unroll 和 Pipeline 指令的关系,Pipeline 指令放置的循环层次越高,循环展开的层次也越高,最终会导致使用更大面积的资源去实现,同时并行性也更高。

pIYBAGAJe8GAUqsaAAOfRydUAUE307.png

这里如果循环的边界是变量的话,则无法展开。这将组织函数被流水线化,可以通过添加tripcount 等指令,指定循环在综合时大概的最大最小边界。

在循环流水线优化的过程中,有一个完美循环,半完美循环和非完美循环的代码风格概念,只有当流水线循环完美或半完美时,才可以将嵌套循环彻底并行展开。

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

半完美循环:只有最里面的循环才具有主体 (内容), 在循环语句之间没有指定逻辑,只有最外面的循环边界可以是可变的。

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

pIYBAGAJfAOAJQTrAAO0fO_yjLU263.png

当我们要争去最大流水线循环的成功执行,就需要将非完美循环手动修改成完美或半完美循环。 以下代码例子给出了完美循环(左边)和非完美循环(右边)在Vitis HLS 中的执行结果。

o4YBAGAJfEGAEP37AABWikWhzdc769.png

o4YBAGAJfIGAGbXPAAKaN1p2Ycs520.png

综合完毕后,我们可以在分析窗口和综合报告中都很清晰的看出,完美循环在执行的时候,工具自动将内层循环LOOP_J和外层循环LOOP_I合并为一整个大循环,并实现了整个大循环的流水线操作,延迟的周期数为: (400-1) *1+8-1 =406个周期数,延迟大约为 408*2.5 = 1,020 ns

非完美循环中,内层和外层循环没有合并,只有内层循环LOOP_J 实现了流水线执行,进出内循环的浪费的时钟周期增加了整个循环的时钟周期,同时还有一些命令行没有办法跨越循环的层级实现调度上的优化,这些因素都导致了设计的延迟的增加。

本文关于pipeline 以及 unroll 指令的介绍到此结束,下篇文章我们将着重介绍 daraflow 指令。

审核编辑:何安

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

    关注

    1

    文章

    579

    浏览量

    35374
收藏 人收藏

    评论

    相关推荐

    浅析SpinalHDL中Pipeline中的复位定制

    之前有系列文章介绍了SpinalHDL中Pipeline的使用,最近在一个功能模块中真实的使用了这个lib。
    的头像 发表于 03-17 17:31 559次阅读
    浅析SpinalHDL中<b class='flag-5'>Pipeline</b>中的复位定制

    什么是pipeline?Go中构建流数据pipeline的技术

    本文介绍了在 Go 中构建流数据pipeline的技术。 处理此类pipeline中的故障很棘手,因为pipeline中的每个阶段可能会阻止尝试向下游发送值,并且下游阶段可能不再关心传
    的头像 发表于 03-11 10:16 160次阅读

    三菱plc基本指令介绍

    PLS(上升沿微分指令) 在输入信号上升沿产生一个扫描周期的脉冲输出 (2)PLF(下降沿微分指令) 在输入信号下降沿产生一个扫描周期的脉冲输出。
    发表于 01-23 09:38 222次阅读
    三菱plc基本<b class='flag-5'>指令</b><b class='flag-5'>介绍</b>

    AMD-Xilinx的Vitis-HLS编译指示小结

    流水线指令 pragma HLS pipeline 通过流水线提高性能是计算机架构设计的8个伟大思想之一,不管是硬件设计还是软件设计,流水线设计(pipeline)都能够用更多的资源来实现高速
    发表于 12-31 21:20

    如何在zcu102板卡上创建pipeline呢?

    DisplayPort 1.4 Tx Subsystem core的最简pipeline就是如它的linux driver wiki page里的figure-4那样,framebuffer_read+DP+video_phy。
    的头像 发表于 12-29 10:09 217次阅读

    讲讲ARM指令集格式以及常用的ARM汇编指令

    对于搞嵌入式驱动或者操作系统的人来说,掌握汇编语言的使用还是比较重要的,毕竟有时候在分析定位问题的时候,多多少少都会有汇编的身影。本文主要讲讲ARM指令集格式以及常用的ARM汇编指令(主要包括LDR
    的头像 发表于 11-08 12:34 1038次阅读
    讲讲ARM<b class='flag-5'>指令</b>集格式<b class='flag-5'>以及</b>常用的ARM汇编<b class='flag-5'>指令</b>

    Pipeline中throwIt的用法

    字如其名,来看下Pipeline中throwIt的用法,是怎么个丢弃方式。
    的头像 发表于 10-21 16:24 281次阅读
    <b class='flag-5'>Pipeline</b>中throwIt的用法

    AT32F4 DSP指令使用介绍

    AT32F4 DSP指令使用介绍AT32F4xx DSP指令使用介绍
    发表于 10-20 07:15

    怎样使用SpinalHDL Pipeline组件里的resulting及overloaded?

    关于stageableToData,在之前的文章中已有介绍,今天来看下stageableOverloadedToData以及stageableResultingToData的作用。
    的头像 发表于 09-11 09:47 731次阅读
    怎样使用SpinalHDL <b class='flag-5'>Pipeline</b>组件里的resulting及overloaded?

    关于Linux高级指令介绍

    。本文将介绍一些常见的Linux高级指令,并通过实例说明其用法和功能。 find命令:在海量文件中快速定位目标 find 命令是一个功能强大的文件搜索工具,它可以根据不同的条件搜索文件和目录。以下
    发表于 09-01 15:44

    开箱即用!教你如何正确使用华为云CodeArts Pipeline

    的手工操作。 华为云流水线服务CodeArts Pipeline,旨在提升编排体验,开放插件平台,以及提供标准化的DevOps企业治理模型,将华为公司内的优秀研发实践赋能给伙伴和客户。 为了让您更好地了解并使用CodeArts Pipe
    的头像 发表于 08-30 11:20 1171次阅读
    开箱即用!教你如何正确使用华为云CodeArts <b class='flag-5'>Pipeline</b>!

    关于农林气象站的基本介绍

    关于农林气象站的基本介绍
    的头像 发表于 08-23 16:58 252次阅读

    SpinalHDL里pipeline的设计思路

    如果你曾看过VexRSICV的设计,对于从事逻辑设计的你会惊讶从未想过逻辑设计还能这么来做。针对VexRSICV所衍生出的pipeline Lib,该系列会对pipeline进行一次梳理。诚如之前一篇博客曾讲,这是“勇者的游戏”。
    的头像 发表于 08-16 15:11 713次阅读
    SpinalHDL里<b class='flag-5'>pipeline</b>的设计思路

    一览pipeline中所出现的五个基本要素

    stageable、StageableKey是最整个pipeline中的基本数据类型元素
    的头像 发表于 08-12 11:24 639次阅读
    一览<b class='flag-5'>pipeline</b>中所出现的五个基本要素

    总结一下pipeline流水线设计的关键点

    pipeline流水线设计是一种典型的面积换性能的设计。一方面通过对长功能路径的合理划分,在同一时间内同时并行多个该功能请求,大大提高了某个功能的吞吐率
    发表于 06-27 15:26 1106次阅读
    总结一下<b class='flag-5'>pipeline</b>流水线设计的关键点