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

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

3天内不再提示

HLS优化设计的最关键指令

YCqV_FPGA_EETre 来源:FPGA开发圈 作者:FPGA开发圈 2021-01-14 09:41 次阅读

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

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

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

Dataflow:Enables task level pipelining, allowing functions andloops 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 指令放置的循环层次越高,循环展开的层次也越高,最终会导致使用更大面积的资源去实现,同时并行性也更高。

7728e698-51a7-11eb-8b86-12bb97331649.png

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

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

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

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

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

779a5dc8-51a7-11eb-8b86-12bb97331649.png

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

Perfect_loop

#include "loop_perfect.h"

void loop_perfect (din_t A[N], dout_t B[N]) {

int i,j;

dint_t acc;

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

LOOP_J: for (j=0; j < 20; j++) { 

if(j==0) acc = 0;

acc += A[j] * j;

if(j==19) {

if (i%2 == 0)

B[i] = acc / 20;

else

B[i] = 0;

}

}

}

}

void loop_imperfect (din_t A[N], dout_t B[N]) {

int i,j;

dint_t acc;

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

acc = 0;

LOOP_J: for (j=0; j < 20; j++) { 

acc += A[j] * j;

}

if (i%2 == 0)

B[i] = acc / 20;

else

B[i] = 0;

}

}

77d756e2-51a7-11eb-8b86-12bb97331649.png

78f8c790-51a7-11eb-8b86-12bb97331649.png

792ca6d2-51a7-11eb-8b86-12bb97331649.png

7962a03e-51a7-11eb-8b86-12bb97331649.png

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

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

责任编辑:lq

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

    关注

    23

    文章

    4599

    浏览量

    92638
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62427
  • 数据流
    +关注

    关注

    0

    文章

    119

    浏览量

    14333
收藏 人收藏

    评论

    相关推荐

    MCU性能与功能:优化设计的关键

    MCU(微控制单元)是现代电子产品中不可或缺的核心组件,广泛应用于家电、汽车、工业控制、医疗设备及消费电子等领域。随着科技的不断发展,MCU的性能与功能得到了前所未有的提升,而优化设计成为推动这一变化的关键所在。
    的头像 发表于 11-01 13:26 178次阅读

    如何优化 Llama 3 的输入提示

    优化输入提示(prompt engineering)是提高人工智能模型输出质量的关键步骤。对于Llama 3这样的模型,优化输入提示可以帮助模型更准确地理解用户的意图,从而生成更相关和高质量的内容
    的头像 发表于 10-27 14:39 318次阅读

    在选择SD-WAN提供商时,需要关注哪些关键指标?

    在选择SD-WAN提供商时,应该关注以下关键指标: 1、带宽利用率:SD-WAN应能有效利用可用带宽,确保数据传输的高效与稳定。 2、路径选择与负载均衡:SD-WAN需要能够智能选择最佳路径并实现
    的头像 发表于 09-30 12:24 185次阅读

    高频电路设计中的关键指

    为了确保高频电路的高效运行和可靠性,一系列性能指标被提出并严格遵循。这些性能指标涵盖了增益、通频带、选择性、噪声系数和稳定性等多个方面,下面将逐一探讨这些关键指标及其在高频电路设计中的重要性。 增益
    的头像 发表于 09-20 16:31 394次阅读

    您想了解的数据采集DAQ关键指标都在这里了

    数据采集DAQ关键指标有哪些
    的头像 发表于 09-03 13:52 314次阅读
    您想了解的数据采集DAQ<b class='flag-5'>关键指</b>标都在这里了

    优化 FPGA HLS 设计

    优化 FPGA HLS 设计 用工具用 C 生成 RTL 的代码基本不可读。以下是如何在不更改任何 RTL 的情况下提高设计性能。 介绍 高级设计能够以简洁的方式捕获设计,从而
    发表于 08-16 19:56

    一种在HLS中插入HDL代码的方式

    很多人都比较反感用C/C++开发(HLS)FPGA,大家第一拒绝的理由就是耗费资源太多。但是HLS也有自己的优点,除了快速构建算法外,还有一个就是接口的生成,尤其对于AXI类接口,按照标准语法就可以很方便地生成相关接口。
    的头像 发表于 07-16 18:01 658次阅读
    一种在<b class='flag-5'>HLS</b>中插入HDL代码的方式

    电源滤波器选择关键指标解析

    在电子设备日益普及的今天,电源滤波器作为保障电源质量、抑制电磁干扰的重要器件,其选择和应用显得尤为重要。本文维爱普电源滤波器小编将为您详细介绍电源滤波器选择时需要考虑的关键指标,帮助您更好地理解和应用电源滤波器。
    的头像 发表于 06-18 10:46 406次阅读
    电源滤波器选择<b class='flag-5'>关键指</b>标解析

    部分TIA集成指令处理的方法介绍

    对于优化的DB块,可使用FILL_BLK指令或创建相同的UDT结构类型的DB块,使用MOVE指令清零DB块数据。
    发表于 04-15 09:34 1068次阅读
    部分TIA集成<b class='flag-5'>指令</b>处理的方法介绍

    如何优化HLS仿真脚本运行时间

    需求:由于自己目前一个 HLS 仿真脚本需要运行 1个多小时,先打算通过打印时间戳的方式找出最耗时的部分,然后想办法优化
    的头像 发表于 02-23 09:29 633次阅读

    TVS选型四个关键指标及选型

    TVS选型四个关键指关键词:TVS选型、工作电压、瞬态电流、箝位电压、电容值1.工作电压(Vrwm)要选择合适的TVS,工作电压是首要考虑的指标。根据电路的最高电压,选择工作电压稍高于最高电压
    的头像 发表于 01-26 08:03 1121次阅读
    TVS选型四个<b class='flag-5'>关键指</b>标及选型

    TVS选型四个关键指标及选型

    可靠保护电路。 # 2. 箝位电压(Vc) 箝位电压是TVS开始工作并稳定电压范围的关键。根据需要抑制的过电压范围,选择合适的箝位电压,确保TVS有效抑制过电压。 TVS选型四个关键指标的大小选择 关键词:TVS选型、工作电压、
    的头像 发表于 01-24 15:39 805次阅读
    TVS选型四个<b class='flag-5'>关键指</b>标及选型

    示波器的三大关键指标有哪些?

    示波器的三大关键指标有哪些? 示波器是一种用来观察和测量电信号的仪器。它通过显示电压随时间变化的图形,使我们能够观察信号的振幅、频率、相位和波形等特征。在选择和使用示波器时,有三个关键指标需要我们
    的头像 发表于 01-17 15:14 1222次阅读

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

    。 含多个退出条件的循环 由于篇幅原因,这里就不细讲了,详情可以参考Vitis高层次综合用户指南 (UG1399) 阵列优化指令 pragma HLS array_partition
    发表于 12-31 21:20

    研讨会:利用编译器指令提升AMD Vitis™ HLS 设计性能

    /C++ 代码为 AMD 设备上可编程逻辑的 RTL 代码加速 IP 创建。 在 Vitis HLS 中,优化指令脱颖而出成为最强大的工具之一,使设计人员能够从相同底层 C 模型出发,探索各种架构
    的头像 发表于 12-05 09:10 518次阅读
    研讨会:利用编译器<b class='flag-5'>指令</b>提升AMD Vitis™ <b class='flag-5'>HLS</b> 设计性能