Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录

1. 简介

2. 代码解析

2.1 原始代码

2.2 优化后

2.3 分析优化措施

3. 总结


1. 简介

在Vitis HLS中,实现II(迭代间隔)= 1是提高循环执行效率的关键。II=1意味着每个时钟周期都可以开始一个新的迭代,这是最理想的情况,可以大大提高硬件执行的并行度和速度。

本文对两个示例进行分析,针对存在的存储器访问瓶颈进行优化,以实现迭代间隔为1的目标。随后将详细解析优化后的代码,探讨优化措施对性能的影响。

2. 代码解析

2.1 原始代码

存储器访问存在瓶颈

#include "ap_int.h"

ap_int<10> example(ap_int<7> mem[128]) {

	ap_int<10> sum = 0;
    int i;

SUM_LOOP:
    for (i = 2; i < 128; ++i)
        sum += mem[i] + mem[i - 1] + mem[i - 2];

    return sum;
}

 综合报告:

+ 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|
    +-------------+------+------+---------+-----------+----------+---------+------+----------+------+----+----------+-----------+-----+
    |+ example    |     -|  4.64|      254|  2.540e+03|         -|      255|     -|        no|     -|   -|  39 (~0%)|  211 (~0%)|    -|
    | o SUM_LOOP  |    II|  7.30|      252|  2.520e+03|         3|        2|   126|       yes|     -|   -|         -|          -|    -|
    +-------------+------+------+---------+-----------+----------+---------+------+----------+------+----+----------+-----------+-----+
  • 函数总延迟:254 cycles
  • 循环总延迟:252 cycles
  • 没有使用 BRAM 或者 URAM,通过 fabric 实现存储器

此段原始代码中,每次循环迭代都会从 mem 数组中读取三次数据(mem[i]、mem[i-1]和mem[i-2]),这些重复的内存访问会增加访问延迟。

2.2 优化后

实现II(迭代间隔)= 1。

#include "ap_int.h"

ap_int<10> example(ap_int<7> mem[128]) {

	ap_int<7> tmp0, tmp1, tmp2;
    ap_int<10> sum = 0;
    int i;

    tmp0 = mem[0];
    tmp1 = mem[1];
SUM_LOOP:
    for (i = 2; i < 128; i++) {
        tmp2 = mem[i];
        sum += tmp2 + tmp1 + tmp0;
        tmp0 = tmp1;
        tmp1 = tmp2;
    }

    return sum;
}

 综合报告:

+ 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|
    +------------------------------+------+------+---------+-----------+----------+---------+------+----------+------+----+----------+-----------+-----+
    |+ example                     |     -|  3.87|      133|  1.330e+03|         -|      134|     -|        no|     -|   -|  57 (~0%)|  198 (~0%)|    -|
    | + example_Pipeline_SUM_LOOP  |     -|  3.87|      129|  1.290e+03|         -|      129|     -|        no|     -|   -|  37 (~0%)|  139 (~0%)|    -|
    |  o SUM_LOOP                  |     -|  7.30|      127|  1.270e+03|         2|        1|   126|       yes|     -|   -|         -|          -|    -|
    +------------------------------+------+------+---------+-----------+----------+---------+------+----------+------+----+----------+-----------+-----+
  • 函数总延迟:133 cycles
  • 循环总延迟:129 cycles
  • 没有使用 BRAM 或者 URAM,通过 fabric 实现存储器

通过引入三个临时变量tmp0、tmp1、tmp2来减少冗余的内存访问。这三个变量用于存储当前及之前两次迭代访问的mem数组元素。在每次循环迭代中,只需要读取一次新的数组元素(tmp2 = mem[i]),然后将这个新读取的值与之前存储的两个值(tmp1和tmp0)相加。然后更新tmp0和tmp1的值,使它们分别变为前一次和当前迭代的值。

在循环内每次只进行一次读取操作。

2.3 分析优化措施

在对原始代码进行优化时,核心目标是改善内存访问模式以提高性能。原始代码中,每次循环迭代需要进行三次内存访问,这导致了存储器访问成为性能的瓶颈。为了解决这一问题,优化后的代码引入了临时变量tmp0、tmp1和tmp2,将前两次迭代的数据存储在这些变量中,从而避免了不必要的重复内存访问。

对于此类问题,可以总结出以下优化原则:

减少内存访问: 通过引入临时变量,优化后的代码显著减少了对存储器的访问次数。现在,每次迭代只需进行一次内存访问,大大降低了访问延迟,提高了数据访问效率。

优化数据重用: 引入临时变量tmp0、tmp1和tmp2使得前两次迭代的数据得以重复利用。这种数据重用策略增强了数据访问的局部性,减少了存储器的频繁访问,有助于进一步提高性能。

改进迭代间隔: 优化后的代码不仅减少了存储器访问次数,还改善了内存访问模式,使得循环执行效率得到了显著提高。这种改进有助于实现迭代间隔II=1,即每个时钟周期开始一个新的迭代,从而进一步提高了整体代码的性能表现。

3. 总结

通过对原始代码进行优化,成功地改善了内存访问模式,提高了循环执行效率。优化后的代码减少了存储器访问次数,优化了数据重用,以及改进了迭代间隔,使得每个时钟周期都可以开始一个新的迭代。这些优化措施有效地减少了存储器访问延迟,提高了硬件执行效率。优化后的代码在性能和效率上都有了显著的提升,更适用于高性能处理应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试八股之HashSet和TreeSet有什么区别

Java中HashSet和TreeSet有什么区别 1. 底层数据结构 HashSet: 基于哈希表&#xff08;实际上是 HashMap 的内部实现&#xff09;实现。每个元素通过其 hashCode() 方法计算出哈希码&#xff0c;并通过哈希码确定其在哈希表中的位置。这种结构使得 HashSet 在插入、删除和查找…

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;其特点是只允许在同一端进行插入和删除操作&#xff0c;这一端被称为栈顶。遵循后进先出&#xff08;Last In, First Out, LIFO&#…

yarn : 无法加载文件 C:\app\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本

系统运行yarn命令报错 解决办法&#xff1a; 一、点击电脑右下角的开始&#xff0c;菜单出来后&#xff0c;直接按键盘输入powerShell搜索&#xff0c;然后右键以管理员身份运行 二、以管理员运行后&#xff0c;会出现下面命令窗口 在窗口上执行&#xff1a;set-ExecutionPoli…

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…

哪家PMP培训机构比较优秀?

不同的培训机构在服务、收费和师资上会有一些差异&#xff0c;但基本都差不多。老师的授课方式对学习兴趣很重要&#xff0c;价格在3000-4000左右&#xff0c;选择中间价位比较好。服务也很关键&#xff0c;有的机构提供代报名和PDU等额外服务。关于机构排名的文章可以参考&…

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…

CCF20181201——小明上学

CCF20181201——小明上学 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int r,y,g,n,k[101],t[101],sum0;cin>>r>>y>>g;cin>>n; for(int i0;i<n;i){cin>>k[i]>>t[i];if(k[i]0||k[i]1)sumt[i];…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

Xilinx RAM IP核的使用及注意事项

对于RAM IP核(Block Memory Generator核)的使用以及界面的配置介绍&#xff0c;文章RAM的使用介绍进行了较详细的说明&#xff0c;本文对RAM IP核使用中一些注意的地方加以说明。 文章目录 三种RAM的区别单端口RAM(Single-port RAM)简单双端口RAM(Simple Dual-port RAM)真双端…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

翻译《The Old New Thing》- Stupid debugger tricks: Calling functions and methods

Stupid debugger tricks: Calling functions and methods - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20070427-00/?p27083 Raymond Chen 2007年04月27日 一个比较笨的调试技巧&#xff1a;调用函数和方法 在过去&#xff0c;如果你想在…

css+html 爱心❤

效果 代码实现 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

给app引导页说goodbye吧,皮之不存,毛将焉附。

有几个原因导致大部分创业者选择不开发独立的移动应用程序&#xff08;App&#xff09;&#xff1a; 成本和资源&#xff1a;开发和维护一个独立的移动应用程序需要投入大量的时间、资金和人力资源。对于创业公司来说&#xff0c;他们可能没有足够的资源来支持这样的开发和维护…

大数据性能测试怎么做?看完这篇终于懂了!

大数据性能测试的目的 1.大数据组件的性能回归&#xff0c;在版本升级的时候&#xff0c;进行新旧版本的性能比对。 2.在新版本/新的生产环境发布之后获取性能基线&#xff0c;建立可度量的参考标准&#xff0c;为其他测试场景或者调优过程提供对比参考。 3.在众多的发行版本…

【好书推荐-第十六期】《 LangChain技术解密:构建大模型应用的全景指南》(Github 6800+示例!)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

【Flask 系统教程 6】进阶操作

Flask操作cookie 在 Flask 中操作 Cookie 是相对简单的。Cookie 是一种存储在用户计算机上的小型数据片段&#xff0c;由服务器发送到用户浏览器&#xff0c;然后在每次请求时由浏览器发送回服务器。在 Flask 中&#xff0c;你可以使用 request 对象来读取 cookie&#xff0c;…

【Maven】简介_下载安装

1.maven简介 项目管理工具项目对象模型 project object model (POM) 一个项目&#xff1a;清理、编译、测试、打包、发布、部署 1.1 为什么需要使用maven 组装机和品牌机的概念IDE &#xff08;集成开发环境&#xff09;不是万能的依赖大量的手工操作&#xff0c;编译、测试、…

npm install [Error]

npm install 依赖的时候报错 依赖版本问题的冲突&#xff0c;忽视即可 使用 npm install --legacy-peer-deps

个人写表格辅助软件

该软件作用 Excel 的辅助&#xff0c;可以执行excel不方便的操作&#xff0c;从excel复制数据到软件进行操作又复制回Excel。 下载软件地址 ,大小&#xff1a;65kb 点击下载 完整UI 列操作 右键单击列名弹出菜单 单元格操作 右键单击单元格弹出菜单 导航模式 每个操作都可以…