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

    文章

    4760

    浏览量

    97144
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66838
  • 数据流
    +关注

    关注

    0

    文章

    129

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

    详解示波器的三大关键指

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

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

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

    利用Arm i8mm指令优化llama.cpp

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

    Vivado HLS设计流程

    为了尽快把新产品推向市场,数字系统的设计者需要考虑如何加速设计开发的周期。设计加速主要可以从“设计的重用”和“抽象层级的提升”这两个方面来考虑。Xilinx 推出的 Vivado HLS 工具可以
    的头像 发表于 04-16 10:43 1349次阅读
    Vivado <b class='flag-5'>HLS</b>设计流程

    使用各种TensorFlow模型运行模型优化器时遇到错误非法指令怎么解决?

    使用各种 TensorFlow 模型运行模型优化器时遇到 [i]错误非法指令
    发表于 03-05 09:56

    大语言模型的解码策略与关键优化总结

    的技术参考。主要涵盖贪婪解码、束搜索、采样技术等核心解码方法,以及温度参数、惩罚机制等关键优化手段。大型语言模型的技术基础大型语言模型是当代自然语言处理技术的核心
    的头像 发表于 02-18 12:00 1071次阅读
    大语言模型的解码策略与<b class='flag-5'>关键</b><b class='flag-5'>优化</b>总结

    SAR ADC的工作过程和关键指

    ADC以其低功耗、高精度、小尺寸以及适中的速度和分辨率,在中等至高分辨率应用中占据主导地位。本文将详细介绍SAR ADC的概念、工作过程、关键指标以及其在不同领域的应用。
    的头像 发表于 02-02 13:57 2216次阅读

    前端性能优化:提升用户体验的关键策略

    在互联网飞速发展的今天,用户对于网页的加载速度和响应性能要求越来越高。前端性能优化成为了提升用户体验、增强网站竞争力的关键策略。一个性能良好的前端应用,能够快速响应用户的操作,减少等待时间,为用户
    的头像 发表于 01-22 10:08 848次阅读

    数字化车间——有哪些关键指标?

    数字化车间是智能制造的核心引擎,通过数字化技术和信息化手段,实现生产数据的实时采集、传输、分析和应用,提高生产效率和管理水平,增强竞争力。影响其性能的关键指标包括设备综合效率(OEE)、时间开动率、性能开动率、合格品率等。
    的头像 发表于 12-23 11:01 1082次阅读
    数字化车间——有哪些<b class='flag-5'>关键指</b>标?

    低噪声运算放大器的关键指标特点、优势和应用场景

    低噪声运算放大器的关键指标特点、优势和应用场景。 1 低噪声 应用场景1: 在大部分高精度放大的应用中,都需要外部增加一款运放进行电流采样放大,而在电路应用系统中一般输入信号幅值比较小,这样就要求运放自身的噪声要远
    的头像 发表于 12-23 10:13 1901次阅读
    低噪声运算放大器的<b class='flag-5'>关键指</b>标特点、优势和应用场景