当前位置: 首页 > news >正文

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习

从这一篇开始正式进入HLS对C++代码的优化笔记

目录

  • 1.循环优化中的基本参数
  • 2.PIPELINE & UNROLL
  •     2.1.PIPELINE
  •     2.2.UNROLL
  • 3.LOOP_MERGE

1.循环优化中的基本参数

以如下程序为例,top.h:

#include <ap_int.h>#define N 3#define XW 8
#define BW 16typedef ap_int<XW> dx_t;
typedef ap_int<BW> db_t;
typedef ap_int<BW+1> do_t;void func(dx_t xin[N], dx_t a, db_t b, db_t c, do_t yo[N]);

top.cpp:

#include "top.h"void func(dx_t xin[N], dx_t a, db_t b, db_t c, do_t yo[N])
{int i = 0;loop:for (i = 0; i < N; i++){yo[i] = a * xin[i] + b + c;}
}

从本篇开始,top函数更改为通用的func,这样只改其中的逻辑和参数就行,记得第一次运行要在设置中更改Top函数,更改方式请参考上一篇笔记。

从程序代码出发,对loop标签下的for循环进行分析,可以得到其全过程时序如下,其中每个属性的含义:

1 clock cycle:一个基本操作需要一个时钟周期
Loop Trip Count:循环次数,N==3,所以为3
Loop Iteration Latency:一轮循环执行所需时间
Loop Iteration Interval(Loop II):两轮循环相隔的时间,这里和循环执行时间相等的原因:1.HLS识别到循环次数为常数,省略了对变量i的操作,如果N是变量则这个时间会相应增加。2.在编程中并未让其流水线操作或展开(UNROLL),否则这个时间会减少或直接为0。
Loop Latency:循环总执行时间,等于Loop Iteration Latency * Loop Trip Count
Function Latency:函数的执行时间,这里应该是Rd a,b,c,这三个变量传进来之后不再改变,读一次就行
Function Initial Interval(II):两轮函数的执行间隔,这里应该放在Rd之前,函数放在一个循环内时:1.如果函数执行结束到下一轮该函数执行之间有操作的话,这一时间会增加2.如果对循环和函数进行优化,函数可能并发执行(多个函数实例,间隔为0)、流水线执行(间隔减小)

2.PIPELINE & UNROLL

2.1.PIPELINE

For循环最常见也是最常用的优化就是PIPELINE,可以右键Directive中循环的标签进行添加(所有循环都应添加标签,便于进行优化和DEBUG),也可以在循环的左大括号下一行添加#pragma HLS PIPELINE:

loop:for (int i = 0; i < N; i++){
#pragma HLS PIPELINE/* 函数体 */}

添加PIPELINE后,第一节提到的Loop Iteration Interval (Loop II)循环迭代间隔就变为了1,因为3次循环间没有数据依赖,所以间隔为一个cycle,循环耗时从9减少到5:


2.2.UNROLL

UNROLL会将循环全部展开,如循环次数为3,则将原本1组电路进行3次运算更改为3组电路分别进行1次计算,通过消耗N倍资源换取N倍效率,其添加方法与PIPELINE相同:

#pragma HLS UNROLL

有时,循环的次数实在过多,全部展开会用光板子的资源,那么我们可以将其部分展开,使用UNROLL的参数factor进行配置,如factor=3时,会将循环展开为3组电路,消耗3倍资源换取3倍效率:

// factor为复制份数(消耗资源倍数)
#pragma HLS UNROLL factor=3

我们之前提到过,将C++原本的数据类型换为HLS的任意精度数据类型可以增加资源利用率,那么我们复制了这么多循环,for()中i的类型是否要考虑更换呢?事实上,vitis会考虑i的最大值,也就是N,来对其实际占用的空间进行资源优化,int i = 0;和ap_int<4> i = 0;实际没有区别,如果i<N的N是变量,那么N的数据类型是很重要的,这一点在以后会讲到。

3.LOOP_MERGE

考虑如下图中的情况,add循环和sub循环都用到了a[i]和b[i],并且循环上限都为N,从硬件设计的角度上讲,这两个循环完全可以合并,如右图中的逻辑:

在这里我们引入loop region的概念,它实际上就是对一段大括号括起的代码块声明的标签,在这里用作LOOP_MERGE的作用域。

然后我们对loop region添加LOOP_MERGE约束,与for添加约束的逻辑相同,通过图形界面Directive右键添加,或者在代码块第一行编写#pragma HLS LOOP_MERGE,就可以实现两个循环的并发执行:

void func(data_t a[N], data_t b[N], data_t c[N], data_t d[N])
{int i;loop_region:{
#pragma HLS LOOP_MERGEadd:for (i = 0; i < N; i++){c[i] = a[i] + b[i];}sub:for (i = 0; i < N; i++){d[i] = a[i] - b[i];}}
}

这样不仅能提高效率,并且在代码编写的过程中可以更好的区分逻辑,让代码有更好的可读性和可维护性。

如果两个循环的边界不同,如下图:

合并时将根据更大的循环决定循环次数,这没有问题,较少的那个循环之后就不会获取这个循环模块的sub输出了。

需要注意的是,如果两个(或多个)循环的循环上限有常量也有变量,那么LOOP_MERGE会报错:

而如果循环上限有2个及以上的变量,那么即便变量的范围相同,LOOP_MERGE也会报错:

如何避免这样的问题?如果编程者可以通过设计,预先确定多个变量中哪个变量最小,那么就可以LOOP_MERGE最小变量次数的循环,然后在loop region外执行剩余的循环,如下是能确定K<=J的情况:


下一篇笔记将对For循环的DATAFLOW、嵌套和其他优化进行介绍。

相关文章:

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 目录 1.循环优化中的基…...

web实操4——servlet体系结构

servlet体系结构 我们基本都只实现service方法&#xff0c;其余几个都不用&#xff0c; 之前我们直接实现servlet接口&#xff0c;所有的方法都必须实现&#xff0c;不用也得写&#xff0c;不然报错&#xff0c;写了又不用当摆设。 能不能只要定义一个service方法就可以&…...

Linux开发讲课48--- Linux 文件系统概览

本文旨在高屋建瓴地来讨论 Linux 文件系统概念&#xff0c;而不是对某种特定的文件系统&#xff0c;比如 EXT4 是如何工作的进行具体的描述。另外&#xff0c;本文也不是一个文件系统命令的教程。 每台通用计算机都需要将各种数据存储在硬盘驱动器&#xff08;HDD&#xff09;…...

Node.js 模块详解

模块的概念 Node.js 运行在 V8 JavaScript 引擎上&#xff0c;通过 require() 函数导入相关模块来处理服务器端的各种进程。一个 Node.js 模块可以是一个函数库、类集合或其他可重用的代码&#xff0c;通常存储在一个或多个 .js 文件中。 例如&#xff0c;启动一个 Node.js 服…...

大厂面试真题-说说tomcat的优缺点

Tomcat作为服务器&#xff0c;特别是作为Java Web服务器&#xff0c;具有一系列优点和缺点。以下是对其优缺点的详细分析&#xff1a; 优点 开源免费&#xff1a; Tomcat是一个免费、开源的Web服务器&#xff0c;用户可以在任何环境下自由使用&#xff0c;无需支付任何费用。…...

Linux系统编译boot后发现编译时间与Windows系统不一致的解决方案

现象 如下图&#xff0c;从filezilla软件看虚拟机Linux中编译的uboot.img修改时间与Windows系统时间不同 解决过程 在Linux中查看编译的uboot详细信息&#xff0c;从而得到编译时间。终端输入ls -l后&#xff0c;如下图&#xff1a; 结论 说明在Linux是按照Windows系统时…...

WPS Office手机去广高级版

工具介绍功能特点 WPS Office是使用人数最多的移动办公软件&#xff0c;独有手机阅读模式&#xff0c;字体清晰翻页流畅&#xff1b;完美支持文字&#xff0c;表格&#xff0c;演示&#xff0c;PDF等51种文档格式&#xff1b;新版本具有海量精美模版及高级功能 安装环境 [名称…...

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式&#xff0c;用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则的字符串”&#xff0c;此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在&#xff0c;而非python独有。对其知识点…...

Python处理PDF组件使用及注意事项

在 Python 中处理 PDF 文件时&#xff0c; 使用的组件及注意事项如下&#xff1a; 1. PyPDF2 / PyPDF4 说明&#xff1a; PyPDF2 和 PyPDF4 都是功能强大的 PDF 操作库&#xff0c;适用于合并、拆分、旋转 PDF 文件&#xff0c;提取 PDF 元数据等。PyPDF4 是 PyPDF2 的一个分…...

langgraph_plan_and_execute

整体入门demo 教程概览 欢迎来到LangGraph教程&#xff01; 这些笔记本通过构建各种语言代理和应用程序&#xff0c;介绍了如何使用LangGraph。 快速入门&#xff08;Quick Start&#xff09; 快速入门部分通过一个全面的入门教程&#xff0c;帮助您从零开始构建一个代理&a…...

[代码随想录打卡Day8] 344.反转字符串 541. 反转字符串II 54. 替换数字

反转字符串 难度&#xff1a;易。 问题描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 这个就是开头…...

DCN DCWS-6028神州数码 AC 设备配置笔记

DCN DCWS-6028神州数码 AC 设备配置笔记 一、前期准备 PC 电脑网络配置 目的:使 PC 能够访问 AC 的 web 管理控制台。配置详情:web 管理控制台地址为 192.168.1.10,将 PC 电脑 IP 地址配置在 192.168.1.1 - 192.168.1.254 网段内,如 192.168.1.110,子网掩码 255.255.255.…...

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…...

华为OD技术一面手撕题

150. 逆波兰表达式求值 来自leecode 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都…...

Qt低版本多网卡组播bug

原文地址 最近在某个项目中&#xff0c;发现了一个低版本Qt的bug&#xff0c;导致组播无法正常使用&#xff0c;经过一番排查&#xff0c;终于找到了原因&#xff0c;特此记录。 环境 Qt&#xff1a;5.7.0 mingw32操作系统&#xff1a;windows 11 现象 在Qt5.7.0版本中&…...

Leetcode:540. 有序数组中的单一元素

题目 给你一个仅由整数组成的有序数组&#xff0c;其中每个元素都会出现两次&#xff0c;唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 输入: nums [1,1,2,3,3,4,4,8,8] 输出: 2 输入:…...

Python数据分析NumPy和pandas(二十七、数据可视化 matplotlib API 入门)

数据可视化或者数据绘图是数据分析中最重要的任务之一&#xff0c;是数据探索过程的一部分&#xff0c;数据可视化可以帮助我们识别异常值、识别出需要的数据转换以及为模型生成提供思考依据。对于Web开发人员&#xff0c;构建基于Web的数据可视化显示也是一种重要的方式。Pyth…...

数组指针和指针的区别

区分数组指针和指针数组 int *p[3]和 int (*p)[3] 根据运算符的优先级&#xff0c;"[]"的优先级是高于“*”的&#xff0c;p就会先与[]结合&#xff0c;那么它本质就是数组&#xff0c;数组内存放的是指针&#xff0c;它叫指针数组。&#xff08;int*p[3]&#xff…...

Linux git-bash配置

参考资料 命令提示符Windows下的Git Bash配置&#xff0c;提升你的终端操作体验WindowsTerminal添加git-bash 目录 一. git-bash配置1.1 解决中文乱码1.2 修改命令提示符 二. WindowsTerminal配置git-bash2.1 添加git-bash到WindowsTerminal2.2 解决删除时窗口闪烁问题 三. VS…...

【后端速成Vue】computed计算属性

前言&#xff1a; 本期将会介绍 Vue 中的计算属性&#xff0c;他和 methods 方法又会有什么区别呢&#xff1f;在这里都会给你一一讲解。 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、computed计算属性 概念&#xff1a; 基于现有的数据…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...