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. 总结

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

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

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

相关文章

Java实现音频转文本(语音识别)

在Java中实现音频转文本&#xff08;也称为语音识别或ASR&#xff09;通常涉及使用专门的语音识别服务&#xff0c;如Google Cloud Speech-to-Text、IBM Watson Speech to Text、Amazon Transcribe、Microsoft Azure Speech Services&#xff0c;或者一些开源库如CMU Sphinx。 …

2024年第四届长三角高校数学建模竞赛C题思路

赛道C:汽后配件需求预测问题 在汽后行业的供应链管理中, 精准的需求预测是后续管理及决策的基础。 各个汽后配件即为一个库存单位(SKU, Stock Keeping Unit), 如果可以准确预知未来对于各个配件的市场需求, 就可以提前将库存放在靠近需求的仓库中, 从而降低库存成本,…

HNCTF ——baby_python

H&NCTF 2024 官方WP (qq.com) OpCodes Pickle.jl (juliahub.com) nc之后 PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33267 # Python 3.10.12 from pickle import loads main b"\x80\x04ctypes\nFunctionType\n(ctypes\nCodeType\n(I1\nI0\nI0\n…

[Linux] 常用服务器命令(持续更新)

文件操作 # 显示文件系统的磁盘空间使用情况 df -h全局查找文件 find / -type f -iname "java"find / -name libncurses*拷贝整个文件夹 cp -r /home/a/ /home/b/ 解压&#xff0c;撤销解压 撤销zip解压 zipinfo -1 path/xx.zip | xargs rm -rf 撤销tar解压 tar …

【Vim】

一、什么是Vim&#xff1f; Vim 是一个历史悠久的文本编辑器&#xff0c;可以追溯到 qed。 Bram Moolenaar 于 1991 年发布初始版本。Vim 有着悠久的历史;它起源于 Vi 编辑器&#xff08;1976 年&#xff09;&#xff0c;至今仍在开发中。(Vim has a rich history; it origina…

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…

MySQL第一次作业(基本操作)

目录 一、登陆数据库 二、创建数据库zoo 三、修改数据库zoo字符集为gbk 四、选择当前数据库为zoo 五、查看创建数据库zoo信息 六、删除数据库zoo 一、登陆数据库 指令&#xff1a; mysql -u root -p 二、创建数据库zoo 指令&#xff1a; create database zoo; 三、修改数…

基于PHP+MySQL组合开发的多用户自定义商城系统源码 附带源代码包以及搭建教程

系统概述 互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。商城系统作为电子商务的核心&#xff0c;其开发技术和用户体验直接影响着电商平台的竞争力和用户满意度。本文旨在介绍一个基于PHPMySQL组合开发的多用户自定义商城系统&#xff0c;…

C++学习~~string类

1.STL简单介绍 &#xff08;1&#xff09;标准模版库&#xff0c;是C里面的标准库的一部分&#xff0c;C标准库里面还有其他的东西&#xff0c;但是我们不经常使用&#xff0c;我们经常使用的还是STL这个标准库部分。 &#xff08;2&#xff09;六大件&#xff1a;仿函数&…

C# WinForm —— 16 MonthCalendar 介绍

1. 简介 可以选择单个日期&#xff0c;也可以选择一段日期&#xff0c;在选择时间范围上 比较适用&#xff0c;但不能跨月份选择日期范围 在直观上&#xff0c;可以快速查看、选择日期/日期范围 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般…

Uni-app基础知识

uni-app组成和跨端原理 | uni-app官网uni-app,uniCloud,serverless,uni-app组成和跨端原理,基本语言和开发规范,编译器,运行时&#xff08;runtime&#xff09;,逻辑层和渲染层分离https://uniapp.dcloud.net.cn/tutorial/1.adb连接模拟器 找到adb所在位置&#xff08;一般在hb…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

一网打进Linux下那些查找命令

查找是我们每天都在做的事情&#xff0c;早上醒来找下手机&#xff0c;出门之前查下公交&#xff0c;坐下之后查下资料&#xff0c;分析数据查下模式。 查找文件&#xff0c;查找信息&#xff0c;查找错误是应用起来更为具体的一些工作&#xff0c;而Linux命令行为我们提供了很…

对称加密算法的应用场景

随着信息技术的飞速发展&#xff0c;数据安全成为了至关重要的议题。在保护数据传输和存储的过程中&#xff0c;加密算法扮演着不可或缺的角色。其中&#xff0c;对称加密算法&#xff0c;由于其高效性和易用性&#xff0c;被广泛应用于各种场景中。本文将探讨对称加密算法的主…

Kubernets多master集群构建负载均衡

前言 在构建 Kubernetes 多 Master 集群时&#xff0c;实现负载均衡是至关重要的一环。通过多台 Master 节点配合使用 Nginx 和 Keepalived 等工具&#xff0c;可以有效提高集群的可靠性和稳定性&#xff0c;确保系统能够高效运行并有效应对故障。接下来将介绍如何配置这些组件…

Kotlin 编译器和工具链:深入解析与实践案例

Kotlin 编译器和工具链是构建 Kotlin 项目的核心组件&#xff0c;它们负责将 Kotlin 代码转换为可在 JVM 或 JavaScript 环境中运行的代码。本文将详细介绍 Kotlin 编译器和工具链的工作原理、使用方法&#xff0c;以及在实际开发中的应用案例。 1. 引言 Kotlin 作为一种现代…

JAVA GUI 植物大战僵尸

公众号&#xff1a;编程驿站 没有做太多封装。难免有冗余。源码全部放出&#xff0c;有兴趣者可以再改之。 1. pea 类 package com.hm;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExce…

物业水电抄表系统的全面解析

1.系统概述 物业水电抄表系统是现代物业管理中的重要组成部分&#xff0c;它通过自动化的方式&#xff0c;实时监控和记录居民或企业的水电使用情况&#xff0c;极大地提高了工作效率&#xff0c;降低了人工抄表的错误率。该系统通常包括数据采集、数据传输、数据分析和数据展…

链表OJ题(移除链表元素,反转链表,分割链表,环形链表(是否成环问题),链表中间节点(快慢指针讲解),环形链表(找入环节点))“题目来源力扣附带题目链接”

目录 1.移除链表元素 2.反转链表 2.1三指针法 2.2头插法 3.分割链表 4.链表的中间节点&#xff08;快慢指针&#xff09; 4.1快慢指针 4.2求链表的中间节点 5.环形链表 5.1环形链表是否成环 5.2环形链表入环节点 5.3入环节点推论的不完备性说明 1.移除链表元素 移除…

Microsoft Threat Modeling Tool 使用(三)

Boundary&#xff08;边界&#xff09; 本文介绍信任边界&#xff0c;基于 SDL TM Knowledge Base (Core) 模版&#xff0c;这是一个通用的威胁建模模板&#xff0c;非常适合初学者和大多数威胁建模需求。 这些边界&#xff08;Boundary&#xff09;在微软威胁建模工具中用于表…