Vitis HLS 学习笔记--HLS流水线基本用法

目录

1. 简介

2. 示例

2.1 对内层循环打拍

2.2 对外层循环打拍

2.3 优化数组访问后打拍

3. 总结


1. 简介

本文介绍pipeline的基本用法。pipeline是一种用于提高硬件设计性能的技术。本文介绍了pipeline在累加计算函数中的应用。通过优化内外层循环和数组访问,显著提高了函数的时序性能,实现更高效的硬件设计。

2. 示例

这个程序定义了一个名为func的函数,接受一个长度为20的ap_int类型的数组A,数组中每个元素都是一个长度为5的ap_int类型。函数的目标是计算一个累加值并返回。

函数通过两个嵌套的循环对数组A进行遍历:

  • 外部循环(LOOP_I)遍历数组A的所有元素。
  • 内部循环(LOOP_J)对每个元素执行一个操作。
  • 在内部循环中,数组A的第j个元素与外部循环的迭代次数i相乘,结果累加到一个名为acc的静态ap_int类型变量中。
  • 最终,函数返回累加值acc。

2.1 对内层循环打拍

#include "ap_int.h"ap_int<20> func(ap_int<5> A[20]) {int i, j;static ap_int<20> acc;LOOP_I:for (i = 0; i < 20; i++) {LOOP_J:for (j = 0; j < 20; j++) {
#pragma HLS PIPELINEacc += A[j] * i;}}return acc;
}

C综合后,可以看到时序报告,函数func的Latency=405。循环II=1,Trip Count=400。

+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+------------------+------+------+---------+-----------+----------+---------+------+----------+------+---------+----------+-----------+-----+|      Modules     | Issue|      | Latency |  Latency  | Iteration|         | Trip |          |      |         |          |           |     ||      & Loops     | Type | Slack| (cycles)|    (ns)   |  Latency | Interval| Count| Pipelined| BRAM |   DSP   |    FF    |    LUT    | URAM|+------------------+------+------+---------+-----------+----------+---------+------+----------+------+---------+----------+-----------+-----+|+ func            |     -|  4.92|      405|  4.050e+03|         -|      406|     -|        no|     -|  1 (~0%)|  68 (~0%)|  171 (~0%)|    -|| o LOOP_I_LOOP_J  |     -|  7.30|      403|  4.030e+03|         5|        1|   400|       yes|     -|        -|         -|          -|    -|+------------------+------+------+---------+-----------+----------+---------+------+----------+------+---------+----------+-----------+-----+

可以理解,两层循环20*20=400,II=1,所以Trip Count=400。符合我们的预期。

2.2 对外层循环打拍

#include "ap_int.h"ap_int<20> func(ap_int<5> A[20]) {int i, j;static ap_int<20> acc;LOOP_I:for (i = 0; i < 20; i++) {
#pragma HLS PIPELINELOOP_J:for (j = 0; j < 20; j++) {acc += A[j] * i;}}return acc;
}

 C综合后,可以看到时序报告,func的Latency=13,II=14。

+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+--------+------+------+---------+---------+----------+---------+------+----------+------+---------+----------+-----------+-----+| Modules| Issue|      | Latency | Latency | Iteration|         | Trip |          |      |         |          |           |     || & Loops| Type | Slack| (cycles)|   (ns)  |  Latency | Interval| Count| Pipelined| BRAM |   DSP   |    FF    |    LUT    | URAM|+--------+------+------+---------+---------+----------+---------+------+----------+------+---------+----------+-----------+-----+|+ func  |     -|  0.82|       13|  130.000|         -|       14|     -|        no|     -|  1 (~0%)|  93 (~0%)|  444 (~0%)|    -|+--------+------+------+---------+---------+----------+---------+------+----------+------+---------+----------+-----------+-----+

通过观察Schedule可以发现, 数组A被默认绑定为ap_memory,实现形式是双端口ram,每个周期可读取2个元素,共计10个周期读取完毕,额外有4个周期进行了乘法运算和回写。所以II=14。

此结果并不符合预期,理论上,内层循环应该展开,外层循环被流水线打拍,func的Latency=20才对。

尝试使用 ARRAY_PARTITION 优化数组 A 访问。

#include "ap_int.h"ap_int<20> func(ap_int<5> A[20]) {
#pragma HLS ARRAY_PARTITION dim=0 type=complete variable=Aint i, j;static ap_int<20> acc;LOOP_I:for (i = 0; i < 20; i++) {
#pragma HLS PIPELINELOOP_J:for (j = 0; j < 20; j++) {acc += A[j] * i;}}return acc;
}

 C综合后的结果如下:

+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+----------+-----------+-----+| Modules| Issue|      | Latency | Latency| Iteration|         | Trip |          |      |         |          |           |     || & Loops| Type | Slack| (cycles)|  (ns)  |  Latency | Interval| Count| Pipelined| BRAM |   DSP   |    FF    |    LUT    | URAM|+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+----------+-----------+-----+|+ func  |     -|  1.50|        3|  30.000|         -|        4|     -|        no|     -|  1 (~0%)|  24 (~0%)|  278 (~0%)|    -|+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+----------+-----------+-----+

其中II=4,我无法理解。从Schedule Viewer来看,似乎是乘法运算和回写占用了4个周期。

此结果的原因未知。后续研究之后再补充吧。 

2.3 优化数组访问后打拍

#include "ap_int.h"ap_int<20> func(ap_int<5> A[20]) {
#pragma HLS ARRAY_PARTITION dim=0 type=complete variable=Aint i, j;static ap_int<20> acc;#pragma HLS PIPELINE
LOOP_I:for (i = 0; i < 20; i++) {LOOP_J:for (j = 0; j < 20; j++) {acc += A[j] * i;}}return acc;
}

为了最大化榨取并行处理能力,我们做了“最疯狂”的优化:

  • 使用 ARRAY_PARTITION 对数组A进行分区,将其完全分割为独立元素,每个周期可以访问所有元素。
  • PIPELINE 在函数提内,HLS 工具会展开所有循环,即双层循环会在一个周期内完成。
+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+-----------+-----------+-----+| Modules| Issue|      | Latency | Latency| Iteration|         | Trip |          |      |         |           |           |     || & Loops| Type | Slack| (cycles)|  (ns)  |  Latency | Interval| Count| Pipelined| BRAM |   DSP   |     FF    |    LUT    | URAM|+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+-----------+-----------+-----+|+ func  |    II|  1.50|        3|  30.000|         -|        1|     -|       yes|     -|  1 (~0%)|  240 (~0%)|  649 (~0%)|    -|+--------+------+------+---------+--------+----------+---------+------+----------+------+---------+-----------+-----------+-----+

查看C综合结果,符合我们的预期。

 

3. 总结

本文介绍了使用pipeline进行硬件优化的基本方法,并通过示例展示了不同优化方式的性能影响。针对累加计算函数,我们通过内外层循环的pipeline优化和数组访问优化,显著提高了时序性能,从405个周期降至3个周期。这些优化方法可有效应用于其他硬件设计中,提高性能和效率。

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

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

相关文章

C++初学者,使用汉语编程

现在的IDE是完全支持中文编程的&#xff0c;对于C语系的爱好者来说&#xff0c;又可以发挥自己的想象力了。 今天使用一些宏定义写了一个小程序&#xff0c;用于玩弄C.

合合信息embedding模型登顶MTEB中文榜单:中文文本向量化技术的创新突破

引言MTEB中文榜单&#xff1a;权威性与挑战并存Embedding&#xff1a;特征与优势凸显模型应用&#xff1a;开启文本智能新篇章升级迭代&#xff1a;攻克行业技术难点结尾 引言 在信息化时代&#xff0c;文本数据呈爆炸式增长&#xff0c;如何高效、准确地处理和分析这些文本数…

Apache ShardingSphere知识点表格总结及配置示例

ShardingSphere&#xff08;之前称为Sharding-JDBC&#xff09;是一个分布式数据库解决方案&#xff0c;它提供SQL路由、分片、读写分离、弹性伸缩等功能。ShardingSphere官网的文档和示例也非常详细&#xff0c;所以入门以及在项目中实践其实是很简单的。但是很多培训的课程故…

数据库——实验10 数据库的安全性

1. 安全认证模式 SQL Server有两种身份认证模式&#xff1a;Windows 认证模式和混合认证模式(即 Windows 身份验证和 SQL Server 身份验证)。 (1)仅 Windows 认证模式&#xff1a;这是 SQL Server 2005 的默认身份验证模式&#xff0c;适用于所有登录者均为 Windows 200…

Vue3-element-plus表格

一、element-plus 1.用组件属性实现跳转路由 <el-menu active-text-color"#ffd04b" background-color"#232323" :default-active"$route.path" //高亮 text-color"#fff"router><el-menu-item index"/article/channe…

【算法刷题日志】吸氧羊的StarryCoding之旅 - 贡献法计算

题目链接&#xff1a;https://www.starrycoding.com/problem/3 题目描述 吸氧羊终于注册了一个StarryCoding账号&#xff01;&#xff08;她很开心&#xff09; 但是吸氧羊忘记了它的密码&#xff0c;她想起你是计算机大师&#xff0c;于是就来请教你。 她虽然不记得密码了…

hive将时间字符串转换为timestamp的几种写法

写法一 select from_utc_timestamp(from_unixtime(unix_timestamp(2023-8-7 9:38:10 UTC08:00, yyyy-MM-dd HH:mm:ss)), UTC);写法二 select cast(unix_timestamp(2023-8-7 9:38:10 UTC08:00, yyyy-MM-dd HH:mm:ss) as timestamp);写法三 select cast(trim(split(upper(2023…

校园餐厅预约系统(请打开git自行访问)

校园餐厅预约系统详细介绍 项目地址&#xff1a;https://gitee.com/zhang—xuan/online_booking_system 服务端部分 Socket类 作用&#xff1a;创建socket连接&#xff0c;作为服务端与客户端通信的基础。 Sock_Obj类 基类&#xff1a;定义了服务端需要的基本操作和属性。 派生…

C++ | Leetcode C++题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution { public:int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int)round(fibn / sqrt5);} };

SPI(通信协议)

简介 SPI是一个同步的数据总线&#xff0c;也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。 时钟是一个震荡信号&#xff0c;它告诉接收端在确切的时机对数据线上的信号进行采样。 产生时钟的一侧称为主机&#xff0c;另一侧称为从机。总是…

Oracle基础4

1 视图 1.1 视图的基本创建 查询 t_owners 和 查询 view_test_1 实际是一样的 数据源表发生变化 那么视图也会发生变化 drop view VIEW_TEST_1; select * from T_OWNERS; create view view_test_1 as ( select * from T_OWNERS ); select * from view_test_1; 1.2 对复杂sq…

VMware虚拟机中ubuntu使用记录(6)—— 如何标定单目相机的内参(张正友标定法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、张正友相机标定法1. 工具的准备2. 标定的步骤(1) 启动相机(2) 启动标定程序(3) 标定过程的操作(5)可能的报错 3. 标定文件内容解析 前言 张正友相机标定法…

编译 x264 for iOS

文章目录 编译在 FFMpeg 启用 x264其他编译选项报错处理 环境 &#xff1a; macOS 14.3.1 x264 - 20191217-2245 编译 1、下载 x264 源码 http://download.videolan.org/pub/videolan/x264/snapshots/ 这里我下载x264-snapshot-20191217-2245.tar.bz2 &#xff08;截止2024-…

centos学习- ps命令详解-进程监控的利器

ps命令详解&#xff1a;Linux进程监控的利器 在Linux系统管理中&#xff0c;进程监控是一个至关重要的环节。ps命令是Linux系统中一个功能强大的进程查看工具&#xff0c;通过它可以获取当前系统中所有进程的快照信息&#xff0c;并深入了解各个进程的详细信息。结合其各种选项…

OpenAI下周将发布ChatGPT搜索引擎,挑战谷歌搜索!

目前&#xff0c;多方位消息证实&#xff0c;OpenAI将会在5月9日上午10点公布该消息&#xff0c;大约是北京时间周五的凌晨2点。 5月3日&#xff0c;前Mila研究员、麻省理工讲师Lior S爆料&#xff0c;根据OpenAI最新的SSL证书日志显示&#xff0c;已经创建了search.chatgpt.c…

跨域初识--如何解决跨域

04 【跨域初识】 1.同源策略 同源策略(Same-Origin Policy)最早由Netscape 公司提出&#xff0c;是浏览器的一种安全策略同源&#xff1a; 协议、域名、端口号必须完全相同跨域&#xff1a; 违背同源策略就是跨域 2.如何解决跨域 2.1 JSONP jsonp只支持get请求不支持post请…

Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;12&#xff09;使用消息吐丝&#xff08;Notify Toasts&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 29114848416…

Hyperledger Fabric:构建企业级区块链网络的利器

一、引言 在数字化浪潮中&#xff0c;区块链技术如同一颗璀璨的明珠&#xff0c;以其去中心化、数据不可篡改的特性&#xff0c;在金融、供应链、物联网等多个领域大放异彩。而在这个领域里&#xff0c;Hyperledger Fabric以其开源、灵活、安全的特点&#xff0c;成为企业级区…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2 1、 a 4 # 变量a存储的数字是4 Dev.step(a) # 因为变量a的值是4&#xff0c;所以Dev.step(a)就相当于Dev.step(4)2、 a 1 # 变量a的值为1 for i in range(4):Dev.step(a)Dev.turnLeft()a a 1 # 变量a的值变为…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#x…