Vitis HLS 学习笔记--循环边界包含变量

news2024/11/24 4:28:13

目录

1. 简介

2. 分析与详解

2.1 未优化

2.2 LOOP_TRIPCOUNT 优化指令

2.3 重写变量循环边界

3. 总结


1. 简介

在硬件设计中,循环的迭代次数通常需要是固定的,因为这有助于资源的预分配和时序分析。

循环边界包含变量意味着循环的迭代次数不是固定的,而是由程序运行时的某个变量值决定。这种情况下,编译器无法预先知道循环的确切迭代次数,从而影响代码的优化和性能分析。

当循环包含变量边界时,将禁止执行 Vitis HLS 可应用的某些最优化操作。

int example(int A[32], int n) {

...
    for (i = 0; i < n; i++) {
        out_accum += A[i];
    }
...
}

其中,循环边界由顶层输入驱动的变量 n 来判定。在此情况下,循环被视为包含变量边界,因为 Vitis HLS 无从知晓循环将何时完成。

本文探讨如何解决这种问题。

2. 分析与详解

2.1 未优化

Vitis HLS 工具会尝试循环进行进行最优化,并且最终的报告包含变量循环边界造成的问题。

#include "ap_int.h"

ap_int<13> example(ap_int<8> A[32], ap_uint<5> n) {

    ap_int<13> out_accum = 0;
    ap_uint<5> i;

LOOP:
    for (i = 0; i < n; i++) {
        out_accum += A[i];
    }

    return out_accum;
}

变量循环边界的第一个问题是阻止 Vitis HLS 判定循环时延。

Vitis HLS 可判定完成一次循环迭代所需的时延,但由于它无法静态判定精确的变量宽度值 n,因此无从知晓执行的迭代次数,因而无法报告循环时延(即完全执行循环的所有迭代的周期数)。

存在变量循环边界时,Vitis HLS 会将时延报告为问号 (?) 而不是使用精确值。以下显示了示例的综合后的结果: 

* Loop: 
+----------+---------+---------+----------+-----------+-----------+------+----------+
|          |  Latency (cycles) | Iteration|  Initiation Interval  | Trip |          |
| Loop Name|   min   |   max   |  Latency |  achieved |   target  | Count| Pipelined|
+----------+---------+---------+----------+-----------+-----------+------+----------+
|- LOOP    |        ?|        ?|         2|          1|          1|     ?|       yes|
+----------+---------+---------+----------+-----------+-----------+------+----------+

2.2 LOOP_TRIPCOUNT 优化指令

loop_tripcount 语法

#pragma HLS loop_tripcount min=<int> max=<int> avg=<int>

克服此问题的方法是使用 LOOP_TRIPCOUNT 指令来为循环指定最小和/或最大迭代计数。 

#include "ap_int.h"

ap_int<13> example(ap_int<8> A[32], ap_uint<5> n) {

    ap_int<13> out_accum = 0;
    ap_uint<5> i;

LOOP:
    for (i = 0; i < n; i++) {
#pragma HLS loop_tripcount min=32 max=32 avg=32
        out_accum += A[i];
    }

    return out_accum;
}

循环次数(tripcount) 表示循环的迭代次数。优化后的是示例中,tripcount 最大值 32,那么报告将更新为显示如下内容:

* Loop: 
+----------+---------+---------+----------+-----------+-----------+------+----------+
|          |  Latency (cycles) | Iteration|  Initiation Interval  | Trip |          |
| Loop Name|   min   |   max   |  Latency |  achieved |   target  | Count| Pipelined|
+----------+---------+---------+----------+-----------+-----------+------+----------+
|- LOOP    |       32|       32|         2|          1|          1|    32|       yes|
+----------+---------+---------+----------+-----------+-----------+------+----------+

LOOP_TRIPCOUNT 指令提供的值仅用于报告,或者用于支持 PERFORMANCE 编译指示或指令。指定的循环次数值使 Vitis HLS 能够在报告中判定时延值,以便对来自不同解决方案的值进行比较。要将此循环边界信息用于综合,必须使用断言更新 C/C++ 语言代码,这样会影响综合,由于断言条件假定为 true,因此必须谨慎使用。

由于变量边界循环无法完全展开,因此不仅阻止应用展开 (unroll) 指令,而且还会阻止循环上层的层级的流水打拍操作。

2.3 重写变量循环边界

这里的解决方案是将循环的迭代次数设置为一个固定的最大值(此处为32),然后在循环体内部使用条件语句来决定是否执行循环的主体。

#include "ap_int.h"

ap_int<13> example(ap_int<8> A[32], ap_uint<5> n) {

    ap_int<13> out_accum = 0;
    ap_uint<5> i;

LOOP:
    for (i = 0; i < 32; i++) {
    	if (i < n) {
    		out_accum += A[i];
    	}
    }

    return out_accum;
}

在 LOOP 循环中,i 从0迭代到 32,但只有当 i 小于 n 时,才会将 A[i] 加到累加器 out_accum 上。这样,即使 n 是一个变量,循环的迭代次数也是固定的,满足硬件设计的要求。 

示例中的 for 循环 (LOOP) 则可完全展开。由于此循环的上限固定,因此 Vitis HLS 知晓需创建的硬件数量。在 RTL设计中包含 32 份循环主体副本。每份循环主体副本都包含与之关联的条件逻辑,并根据变量 n 值来执行。

3. 总结

在硬件设计中,固定的循环迭代次数对于资源分配和时序分析至关重要。Vitis HLS 在处理包含变量边界的循环时面临挑战,因为这限制了某些优化操作的执行。通过使用 LOOP_TRIPCOUNT 指令指定迭代次数的范围,可以帮助工具更好地进行时延分析。此外,将循环重写为固定次数的迭代,同时在循环体内部使用条件语句来控制执行,可以满足硬件设计的需求,允许循环展开和流水线化,从而提高性能。这些方法为变量边界循环提供了有效的解决方案,使得即使在变量驱动的情况下,也能实现硬件设计的优化。

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

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

相关文章

MySQL之多表查询—表子查询

一、引言 上一篇博客学习了行子查询。&#xff08;看弹幕&#xff1a;同一张表用or,不同张表用union&#xff09; 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列&#xff0c;这种子查询称为表子查询。 2、常用的操作符 IN 3、…

2024海南省大数据教师培训-Hadoop集群部署

前言 本文将详细介绍Hadoop分布式计算框架的来源&#xff0c;架构和应用场景&#xff0c;并附上最详细的集群搭建教程&#xff0c;能更好的帮助各位老师和同学们迅速了解和部署Hadoop框架来进行生产力和学习方面的应用。 一、Hadoop介绍 Hadoop是一个开源的分布式计算框架&…

使用Nextjs学习(学习+项目完整版本)

创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…

盲盒抽卡机小程序的特点,互联网下市场发展前景

近几年&#xff0c;盲盒抽卡成为了年轻人的新宠&#xff0c;也受到了未成年人的喜爱&#xff0c;卡牌的内容更是丰富多样&#xff0c;涵盖了动漫、漫画、影视等&#xff0c;因此吸引了各类消费者和越来越多的创业者。 目前&#xff0c;随着市场的发展&#xff0c;抽卡机小程序…

2024HW面试 中高级面试面经背诵笔记(持续更新)

常见数据库的端口&#xff0c;Vnc的端口等 参考答案地址&#xff1a;常见数据库默认端口号_数据库端口-CSDN博客 MySQL 3306 Oracle 1521 DB2 5000 PostgreSQL 5432 MongoDB 27017 Redis 6379 SQL Server 1433 vnc的端口是&#xff1a;5900 推荐一个很好的护网笔记&#xff…

代码随想录刷题笔记-哈希表篇

文章目录 242 有效的字母异位词(easy)力扣地址题目描述题目实例解题思路代码实现 383 赎金信(easy)力扣地址题目描述题目实例解题思路代码实现 49 字母异位词分组(mid)力扣地址题目描述题目实例解题思路代码实现 438 找到字符串中所有字母异位词(mid)力扣地址题目描述题目实例解…

802.11漫游流程简单解析与笔记_Part1

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

Leetcode3040. 相同分数的最大操作数目 II

Every day a Leetcode 题目来源&#xff1a;3040. 相同分数的最大操作数目 II 解法1&#xff1a;记忆化搜索 第一步可以做什么&#xff1f;做完后&#xff0c;剩下要解决的问题是什么&#xff1f; 删除前两个数&#xff0c;剩下 nums[2] 到 nums[n−1]&#xff0c;这是一个…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman&#xff1a;HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台&#xff0c;它提供以下关键功能&#xff1a; HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

2003远程桌面端口修改,远程桌面端口修改的方法有哪些

方法一&#xff1a;通过修改注册表 1、打开注册表编辑器&#xff1a; 打开“开始”菜单&#xff0c;点击“运行”&#xff0c;输入“regedit”&#xff0c;然后按下“Enter”键。 2、导航到远程桌面服务的注册表项&#xff1a; 依次展开以下路径&#xff1a; HKEY_LOCAL_M…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架&#xff0c;因此C的语法和数据类型在Qt中都是被支持的&#xff0c;但是Qt中也是定义了一些属于自己的数据类型&#xff0c;不过&#xff0c;好多数据类型都是对C的数据类型进行封装&#xff0c;下面来简要介绍一下这些基…

6.切蛋糕

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/71 题目描述 一个圆型的蛋糕,切 𝑛n 刀…

Rust-06-所有权

所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收即可保障内存安全&#xff0c;下面是所有权以及相关功能&#xff1a;借用&#xff08;borrowing&#xff09;、slice 以及 Rust 如何在内存中布局数据。 通过所有权系统管理内…

JDBC学习笔记(二)进阶篇

一、JDBC 扩展 1.1 实体类和ROM 实体类代码&#xff1a; package com.atguigu.advanced.pojo;//类名就是数据库表的 t_ 后面的单词全写 public class Employee {private Integer empId;//emp_idprivate String empName;//emp_nameprivate Double empSalary;//emp_salarypriva…

FL Studio 21.2.3.4004官方中文破解版下载安装激活教程重磅发布含注册机

今天带来的是FL Studio 21中文版&#xff0c;内置破解补丁&#xff0c;可以完美激活程序。所有功能均可在线编辑&#xff0c;用户可直接操作。同时&#xff0c;因为FL Studio 21是最新版本&#xff0c;所以增加了新的功能。共有八种乐器和效果器插件&#xff0c;包括效果链、音…

在开源处理器架构RISC-V中发现可远程利用的中危漏洞

在RISC-V SonicBOOM处理器设计中发现中度危险的漏洞 最近&#xff0c;西北工业大学的网络空间安全学院胡伟教授团队在RISC-V SonicBOOM处理器设计中发现了一个中度危险的漏洞。这个团队的研究人员发现了一个可远程利用的漏洞&#xff0c;该漏洞存在于开源处理器架构RISC-V中。…

Redis系列-4 Redis集群介绍

Redis集群 Redis提供了持久化能力&#xff0c;保证了重启不会丢失数据&#xff1b;但Redis重启至完全恢复期间&#xff0c;缓存不可用。另外&#xff0c;对于高并发场景下&#xff0c;单点Redis服务器的性能不能满足吞吐量要求&#xff0c;需要进行横向扩展。此时&#xff0c;…

【适配鸿蒙next】Flutter 新一代混合栈管理框架

前言 据最新消息显示&#xff0c;华为今年下半年将全面转向其自主平台HarmonyOS&#xff0c;放弃Android系统。 报道中提到&#xff0c;下一版HarmonyOS预计将随华为即将推出的Mate 70旗舰系列一起发布。 据悉&#xff0c;HarmonyOS Next 已经扩展到4000个应用程序&#xff0c;…

【Python学习1】matplotlib和pandas库绘制人口数变化曲线

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 一、Python库说明 Matplotlib Matplotlib是一个功能强大的Python 2D绘图库&#xff0c;它允…

【实战项目二】Python爬取豆瓣影评

目录 一、环境准备 二、编写代码 一、环境准备 pip install beautifulsoup4 pip intall lxml pip install requests我们需要爬取这些影评 二、编写代码 我们发现每个影评所在的div的class都相同&#xff0c;我们可以从这入手 from bs4 import BeautifulSoup import request…