Vitis HLS 学习笔记--HLS眼中的完美循环嵌套

2024-05-04 06:12

本文主要是介绍Vitis HLS 学习笔记--HLS眼中的完美循环嵌套,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 简介

2. 示例

2.1 不完美循环

2.2 完美循环

2.3 HLS 眼中的循环

3. 总结


1. 简介

在处理嵌套循环时(HDL或HLS工具中),优化循环结构对于实现最佳性能至关重要。嵌套循环的性能优化直接影响着计算的时延和资源利用率。创建完美嵌套的循环意味着循环结构被设计得紧凑、高效,以最大程度地利用硬件资源和并行计算能力。

在硬件描述或高级综合中,循环的每个细节都被转换为硬件电路或流水线阶段。因此,创建完美嵌套循环的目标是确保循环体内的计算被最有效地映射到硬件逻辑中,并且循环的边界和计算步骤都能够被静态分析和优化。这种优化可以带来多方面的好处,包括更低的时延、更高的时钟频率、更少的资源占用和更高的吞吐量。

通过创建完美嵌套的循环,可以确保最内层循环包含所有计算逻辑,并且循环之间没有逻辑依赖或数据依赖,从而允许并行执行和流水线处理。此外,循环边界应该是常量,以便编译器在优化时能够静态确定迭代次数,从而更好地利用硬件资源。最终,这些优化可以使得硬件实现具有更高的性能、更低的时延,并且能够更好地适应特定的应用需求。

以下介绍三种典型的循环及其特点。

完美循环嵌套:

  • 仅限最内层循环才包含循环主体内容。
  • 在循环语句之间不指定任何逻辑。
  • 所有循环边界均为常量。

半完美循环嵌套:

  • 仅限最内层循环才包含循环主体内容。
  • 在循环语句之间不指定任何逻辑。
  • 最外层的循环边界可采用变量。

非完美循环嵌套:

  • 内层循环具有变量边界。
  • 循环主体未完全包含在内层循环内。

2. 示例

2.1 不完美循环

void loop_imperfect(int A[20], int B[20]) {int i, j; // 定义循环变量i和jint acc;  // 定义累加器变量acc// 外层循环遍历数组B的每个元素for (i = 0; i < 20; i++) {acc = 0; // 在计算每个B[i]之前,将累加器归零// 内层循环遍历数组A,计算加权和for (j = 0; j < 20; j++) {acc += A[j] * j; // 将A[j]与其索引j相乘,并累加到acc}// 根据索引i的奇偶性决定B[i]的值if (i % 2 == 0)B[i] = acc / 20; // 如果i是偶数,B[i]为acc除以20的结果elseB[i] = 0; // 如果i是奇数,B[i]设为0}
}

如果按照纯软件代码的标准, 这段代码有很大的问题:

  • 内层循环对于每个B[i]都重新计算了加权和,即使B[i]被设为0。这意味着有一半的计算是不必要的。
  • 由于j的范围是固定的,所以acc的计算可以在循环外部进行一次,然后根据需要分配给B[i]。

但是在Vitis HLS的角度,以上两点都不是问题,因为代码最终对应的是硬件的连接。事实上,以上代码的问题是:循环主体未完全包含在内层循环内。

2.2 完美循环

void loop_perfect(int A[20], int B[20]) {int i, j; // 定义循环变量i和jint acc;  // 定义累加器变量acc// 外层循环遍历数组B的每个元素for (i = 0; i < 20; i++) {// 内层循环遍历数组A,计算加权和for (j = 0; j < 20; j++) {if (j == 0) acc = 0; // 当j为0时,累加变量归零acc += A[j] * j; // 将A[j]与其索引j相乘,并累加到acc// 当内层循环到达最后一个元素时,根据i的奇偶输出Bif (j == 19) {if (i % 2 == 0)B[i] = acc / 20; // 如果i是偶数,B[i]为acc除以20的结果elseB[i] = 0; B[i] = 0; // 如果i是奇数,B[i]设为0}}}
}

相对于2.1的“改进点”:

  • 累加器归零(if (j == 0) acc = 0;)的操作被移动到了内层循环的开始。
  • 条件判断(if (j == 19))被放置在内层循环的末尾。

如果按照纯软件代码的标准, 以上代码的问题更大了:

以上两个判断在每次内层循环时都会执行,这是不必要的,因为它只需要在内层循环开始或结束时执行一次!

2.3 HLS 眼中的循环

在 HLS 工具的眼中,完美循环嵌套是指循环结构被优化以便于硬件实现,从而实现最佳的性能和最低的资源使用。

原因如下:

  • 最内层循环包含所有计算:所有的计算逻辑都应该包含在最内层循环中,这样可以最大化并行性和流水线效率。
  • 循环边界是常量:这允许HLS工具在编译时确定循环的迭代次数,从而更好地优化生成的硬件。
  • 没有循环间的逻辑依赖:循环之间不应该有数据依赖或逻辑依赖,这样可以避免不必要的延迟,并允许循环独立地并行执行。
  • 循环展开和流水线:HLS工具可以自动展开循环并应用流水线技术,以提高并行性和吞吐量。
  • 数据访问模式是规则的:数据访问应该是可预测的,以便于HLS工具进行有效的内存访问优化。

因为 HLS 会用到如下两个优化指令:

#pragma HLS UNROLL // 指示HLS工具完全展开这个循环
#pragma HLS PIPELINE // 指示HLS工具流水线化这个循环

第一个指令,会让内层循环完全展开,即内层循环在一个周期内完成。

第二个指令,内层循环可流水线拆分,20个周期内完成。

所以,第二段代码实现了“最内层循环包含所有计算”,是HLS眼中的完美循环。

3. 总结

本文分享了处理嵌套循环时的重要性以及创建完美嵌套循环的关键原则。优化循环结构对于实现最佳性能至关重要,完美循环嵌套的设计能够最大程度地利用硬件资源和并行计算能力,从而提高性能并降低时延。

这篇关于Vitis HLS 学习笔记--HLS眼中的完美循环嵌套的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958492

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下