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

    文章

    4803

    浏览量

    98525
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67826
  • 数据流
    +关注

    关注

    0

    文章

    129

    浏览量

    16515
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FDP SSD的ROCKSDB写放大优化

    作为SSD的关键指标,写放大(WriteAmplification,WA)始终是SSD领域待攻克的技术难题之一。其本质表现为SSD的实际物理写入量超过主机原始请求写入量。
    的头像 发表于 03-23 09:16 537次阅读
    基于FDP SSD的ROCKSDB写放大<b class='flag-5'>优化</b>

    2026年企业采购避坑指南:SMB连接器选型的9个致命错误与关键指

    本文从企业采购和工程师的双重视角出发,系统拆解2026年SMB连接器选型的9大关键指标:阻抗匹配、频率范围、插入损耗、电压驻波比、插拔寿命、温度耐受、环境防护、线缆匹配、认证合规。同时揭示采购中最
    的头像 发表于 03-20 10:45 570次阅读
    2026年企业采购避坑指南:SMB连接器选型的9个致命错误与<b class='flag-5'>关键指</b>标

    HLS设计中的BRAM使用优势

    高层次综合(HLS)是一种将高级编程语言(如C、C++或SystemC)转换为硬件描述语言(HDL)的设计方法。在FPGA设计中,设计者可以灵活地利用FPGA内部的资源,如块RAM(BRAM)。虽然
    的头像 发表于 01-28 14:36 402次阅读

    通过vivado HLS设计一个FIR低通滤波器

    Vivado HLS是一款强大的高层次综合工具,可将C/C++代码转换为硬件描述语言(HDL),显著提升FPGA开发效率。
    的头像 发表于 01-20 16:19 527次阅读
    通过vivado <b class='flag-5'>HLS</b>设计一个FIR低通滤波器

    从硬件设计优化到可靠性的挑战

    1、指令冗余 在双字节指令和三字节指令后插入两个NOP指令,防止抛费程序错误执行后续指令。 对关键指令
    发表于 11-25 07:20

    请问Keil的优化等级到底该如何选择?

    能、资源占用和开发效率的关键。Keil MDK通常提供以下几个主要的优化等级选项。 -O0 (无优化 / Optimization Level 0): 目标: 提供最佳的调试体验。 行为: 编译器几乎不
    发表于 11-20 07:51

    详解示波器的三大关键指

    这些问题,很可能是因为你没有真正理解示波器的三大关键指标:带宽、采样率和存储深度。今天,我们就来彻底搞懂这三个参数,让你的调试工作事半功倍!
    的头像 发表于 10-29 17:45 4410次阅读
    详解示波器的三大<b class='flag-5'>关键指</b>标

    浮点运算单元的设计和优化

    浮点运算单元的设计和优化可以从以下几个方面入手: 1.浮点寄存器设计:为了实现浮点运算指令子集(RV32F或者RV32D),需要添加一组专用的浮点寄存器组,总共需要32个通用浮点寄存器。其中
    发表于 10-22 07:04

    浅谈合科泰MOS管的优化策略

    在开关电源、电机驱动和新能源逆变器等应用中,MOS管的开关速度和电路效率直接影响整体性能和能耗。而MOS管的开关速度与电路效率,它们之间有着怎样的关联,合科泰又是如何通过多项技术创新对MOS管进行优化的呢?提升MOS管的这两个关键指标,助力工程师实现更高能效的设计。
    的头像 发表于 09-22 11:03 1085次阅读

    便携式矿物地物光谱仪选购指南:关键指标与实用技巧揭秘

    选择和技术参数的考量。因此,了解这些仪器的关键指标和实用技巧,能帮助您做出更明智的决策,满足各类矿物分析需求。 定义与工作原理 便携式矿物地物光谱仪是一种便于现场使用的设备,主要利用地物光谱技术进行矿物成分分析
    的头像 发表于 08-19 11:31 1015次阅读
    便携式矿物地物光谱仪选购指南:<b class='flag-5'>关键指</b>标与实用技巧揭秘

    利用Arm i8mm指令优化llama.cpp

    本文将为你介绍如何利用 Arm i8mm 指令,具体来说,是通过带符号 8 位整数矩阵乘加指令 smmla,来优化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。
    的头像 发表于 07-24 09:51 2191次阅读
    利用Arm i8mm<b class='flag-5'>指令</b><b class='flag-5'>优化</b>llama.cpp

    如何在Unified IDE中创建视觉库HLS组件

    最近我们分享了开发者分享|AMD Vitis HLS 系列 1 - AMD Vivado IP 流程(Vitis 传统 IDE)和开发者分享|AMD Vitis HLS 系列 2:AMD
    的头像 发表于 07-02 10:55 1674次阅读
    如何在Unified IDE中创建视觉库<b class='flag-5'>HLS</b>组件

    使用AMD Vitis Unified IDE创建HLS组件

    这篇文章在开发者分享|AMD Vitis HLS 系列 1 - AMD Vivado IP 流程(Vitis 传统 IDE) 的基础上撰写,但使用的是 AMD Vitis Unified IDE,而不是之前传统版本的 Vitis HLS
    的头像 发表于 06-20 10:06 2546次阅读
    使用AMD Vitis Unified IDE创建<b class='flag-5'>HLS</b>组件

    如何使用AMD Vitis HLS创建HLS IP

    本文逐步演示了如何使用 AMD Vitis HLS 来创建一个 HLS IP,通过 AXI4 接口从存储器读取数据、执行简单的数学运算,然后将数据写回存储器。接着会在 AMD Vivado Design Suite 设计中使用此 HLS
    的头像 发表于 06-13 09:50 2239次阅读
    如何使用AMD Vitis <b class='flag-5'>HLS</b>创建<b class='flag-5'>HLS</b> IP

    激光器的多样分类与选型关键指标全解析

    理解各类激光器的特点及其关键指标,对于确保应用效果至关重要。本文将对此进行全面解析。 激光器的多样分类 激光器作为现代科技的重要产物,根据不同的分类标准,可以划分为多个种类。以下是从几个主要维度对激光器的分
    的头像 发表于 04-23 06:26 1940次阅读
    激光器的多样分类与选型<b class='flag-5'>关键指</b>标全解析