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

news2025/1/12 21:04:14

目录

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和j
    int 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的结果
        else
            B[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和j
    int 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的奇偶输出B
            if (j == 19) {
                if (i % 2 == 0)
                    B[i] = acc / 20; // 如果i是偶数,B[i]为acc除以20的结果
                else
                    B[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. 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…

什么是数据工程?

目录 一、什么是数据工程&#xff1f; 二、数据工程在医疗行业中的应用 三、数据工程在精准医疗方面的应用有哪些&#xff1f; 一、什么是数据工程&#xff1f; 数据工程是一个综合性的技术学科&#xff0c;涵盖了从数据的收集、存储、处理、分析到应用的整个数据处理过程。…

深入了解 Arthas:Java 应用程序诊断利器

序言 在 Java 应用程序的开发和运维过程中&#xff0c;诊断和解决性能问题是一项非常重要的任务。而 Arthas 作为一款由阿里巴巴开发的 Java 应用程序诊断工具&#xff0c;提供了一系列强大的功能&#xff0c;帮助开发人员实时监控、诊断和调优Java 应用程序。本文将深入介绍 …

光伏光热一体化技术PVT

1、PVT集热器简介 太阳能光伏光热一体化组件主要由光伏与光热两个部分组成。光伏部分采用技术成熟的太阳能光伏面板&#xff0c;通过控制系统为建筑提供所需电能&#xff0c;主要包括光伏电池、蓄电池、逆变器和控制器等构件。光热部分主要为集热器&#xff0c;将太阳能转换为热…

禅道项目管理系统 身份验证漏洞分析QVD-2024-15263

前言 最近不怎么更新了&#xff01;向小伙伴说明下 我不是什么组织 更不什么经销号&#xff08;尽管csdn有很多经销广告号&#xff09; 一确实是下岗了&#xff01;忙着为找工作而发愁。简历都投出去如同石沉大海能不愁吗!.哎...... 二是忙着论文及材料的事...…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;三&#xff09;后…

嵌入式开发四:STM32 基础知识入门

为方便更好的学习STM32单片机&#xff0c;本篇博客主要总结STM32的入门基础知识&#xff0c;重点在于理解寄存器以及存储器映射和寄存器映射&#xff0c;深刻体会STM32是如何组织和管理庞大的寄存器&#xff0c;从而提高开发效率的&#xff0c;为后面的基于标准库的开发做好铺垫…

Elasticsearch:对 Java 对象的 ES|QL 查询

作者&#xff1a;Laura Trotta ES|QL 是 Elasticsearch 引入的一种新的查询语言&#xff0c;它将简化的语法与管道操作符结合起来&#xff0c;使用户能够直观地推断和操作数据。官方 Java 客户端的新版本 8.13.0 引入了对 ES|QL 查询的支持&#xff0c;提供了一个新的 API&…

手撸Mybatis(四)——连接数据库进行简单查询

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 添加数据库操作模板 对于JDBC操作&#xff0c;一般包括以下几个步骤&#xff1a; 1&#xff09;注册驱动 2&#xff09;建立连接 3&#xff09;执行sql语句 4&#xff09;处理结果 5&#xff09…

【neteq】tgcall的调用、neteq的创建及接收侧统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

Boosting算法揭秘:从原理到scikit-learn实战

Boosting算法揭秘&#xff1a;从原理到scikit-learn实战 在机器学习的江湖中&#xff0c;Boosting算法以其强大的预测能力和独特的训练方式占据了一席之地。与Bagging算法并行训练的理念不同&#xff0c;Boosting算法更注重模型的串行迭代和错误修正。本文将从Boosting算法的基…

JVM笔记1--Java内存区域

1、运行时数据区域 从上图可以看出来&#xff0c;Java虚拟机运行时数据区域整体上可以分成5大块&#xff1a; 1.1、程序计数器 程序计数器是一块较小的内存空间。它可以看做当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c;字节码解释器工作时就是…

【热门话题】Chrome 插件研发详解:从入门到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Chrome 插件研发详解&#xff1a;从入门到实践一、引言二、Chrome 插件基础概念…

汇编语言——输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来

文章目录 以2进制输入&#xff0c;2进制输出&#xff08;无符号&#xff09;以2进制输入&#xff0c;2进制输出&#xff08;带符号&#xff09;以8进制输入&#xff0c;8进制输出以10进制输入&#xff0c;10进制输出以16进制输入&#xff0c;16进制输出 仅供参考 X、Y的输入可…

08 - 步骤 表输出

简介 表输出&#xff08;Table Output&#xff09;步骤是用于将 Kettle 中的数据写入关系型数据库表的步骤。它允许用户将数据流中的数据插入、更新或删除到目标数据库表中。 使用 场景 我要将处理完的数据流中的sysOrgCode 跟 plateNumber 保存记录到mysql 1、拖拽表输出…

目标检测算法YOLOv5简介

没有关于YOLOv5的直接论文&#xff0c;YOLOv5由Ultralytics维护&#xff0c;源码见&#xff1a;https://github.com/ultralytics/yolov5 &#xff0c;于2020年6月发布v1.0版本&#xff0c;最新发布版本为v7.0&#xff0c;License为AGPL-3.0. 以下内容主要来自&#xff1a; 1. U…

MyScaleDB:SQL+向量驱动大模型和大数据新范式

大模型和 AI 数据库双剑合璧&#xff0c;成为大模型降本增效&#xff0c;大数据真正智能的制胜法宝。 大模型&#xff08;LLM&#xff09;的浪潮已经涌动一年多了&#xff0c;尤其是以 GPT-4、Gemini-1.5、Claude-3 等为代表的模型你方唱罢我登场&#xff0c;成为当之无愧的风口…

【R语言数据分析】卡方检验

目录 交叉卡方检验 配对卡方检验 趋势卡方检验 交叉卡方检验 交叉卡方表用于比较组间“率”的差异。适用于分类型变量&#xff0c;被检验的分类变量应该是无序分类变量&#xff0c;分组变量可以是有序分组也可以是无序分组。比如比较两种药物治疗某个疾病的效率&#xff0c;…

Bartender 5 - MacBook菜单栏图标管理软件

当 macOS 桌面图标太多时&#xff0c;既不美观又经常会相互遮盖&#xff0c;非常影响操作。 苹果现在还把「刘海屏」发扬光大&#xff0c;MacBook 的菜单栏是越来越不方便了&#xff01; 如果你希望 Mac 的菜单栏干净清爽、又方便易用&#xff0c;那「Bartender 5」你一定要试…

第15章 基于规格说明的测试技术

一、概述 &#xff08;一&#xff09;依据 《软件需求规格说明书》以及对应的模型或用户需求。 &#xff08;二&#xff09;特点 不考虑内部结构和内部特征 &#xff08;三&#xff09;测试用例满足的标准 利用黑盒测试技术导出测试用例 &#xff08;四&#xff09;测试…