Vitis HLS 学习笔记--优化循环启动间隔(II)

news2024/11/20 16:32:33

目录

1. 概述

2. 常规矩阵乘法

3. 数据依赖性和内存访问模式

4. 优化循环

5. 总结


1. 概述

Initiation Interval(II)定义为启动连续操作之间的时间间隔,以时钟周期为单位。低的II是高性能和高资源利用率的关键。

较高的II意味着在单位时间内完成的操作数量减少,从而降低了整体的吞吐量,部分硬件资源(如加法器、乘法器等)会闲置,没有被充分利用。

2. 常规矩阵乘法

矩阵乘法定义如下:

{\displaystyle (AB)_{ij}=\sum _{r=1}^{n}a_{ir}b_{rj}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots +a_{in}b_{nj}}

 前两层循环,遍历所有元素,第三层循环,用于元素累加乘,代码如下:

for (int i = 0; i < size; i++)
{
    for (int j = 0; j < size; j++)
    {
        for (int k = 0; k < MAX_SIZE; k++)
        {
            int result = (k == 0) ? 0 : temp_sum[j];
            result += A[i][k] * B[k][j];
            temp_sum[j] = result;
            if (k== size -1) C[i][j] = result;
        }
    }
}

对于矩阵A和矩阵B的乘积,每个输出元素C[i][j]是通过将A矩阵的第i行与B矩阵的第j列对应元素相乘然后加总得到的,这意味着在计算C[i][j]的每个元素时,都需要访问A[i][k]和B[k][j]。

3. 数据依赖性和内存访问模式

由于B矩阵的访问是按列进行的,这不是连续的内存访问,会导致缓存利用率低下。

同时,HLS编译器会构建一个加法器树来逐步累加每次乘法的结果。由于每次循环迭代都依赖于前一次的结果,也会导致较高的Initiation Interval(II)。

+-----------------------+---------+---------+----------+-----------+-----------+------+----------+
|                       |  Latency (cycles) | Iteration|  Initiation Interval  | Trip |          |
|       Loop Name       |   min   |   max   |  Latency |  achieved |   target  | Count| Pipelined|
+-----------------------+---------+---------+----------+-----------+-----------+------+----------+
|- lreorder1_lreorder2  |        ?|        ?|        33|         32|          1|     ?|       yes|
+-----------------------+---------+---------+----------+-----------+-----------+------+----------+

 从编译器反馈的结果来看,II=32,每32个时钟周期就可以启动一个新的迭代。

================================================================
== Utilization Estimates
================================================================
* Summary: 
+-----------------+---------+------+--------+--------+-----+
|       Name      | BRAM_18K|  DSP |   FF   |   LUT  | URAM|
+-----------------+---------+------+--------+--------+-----+
|DSP              |        -|     -|       -|       -|    -|
|Expression       |        -|     -|       0|    1813|    -|
|FIFO             |        -|     -|       -|       -|    -|
|Instance         |        -|    96|       0|    5376|    -|
|Memory           |        -|     -|       -|       -|    -|
|Multiplexer      |        -|     -|       -|   10137|    -|
|Register         |        -|     -|    2302|       -|    -|
+-----------------+---------+------+--------+--------+-----+
|Total            |        0|    96|    2302|   17326|    0|
+-----------------+---------+------+--------+--------+-----+
|Available        |      288|  1248|  234240|  117120|   64|
+-----------------+---------+------+--------+--------+-----+
|Utilization (%)  |        0|     7|      ~0|      14|    0|
+-----------------+---------+------+--------+--------+-----+

 对于这些硬件资源,它们在大部分时间内处于空闲状态,硬件的潜在计算能力没有得到充分发挥。

4. 优化循环

 优化后的代码:

for (int i = 0; i < size; i++) {
    for (int k = 0; k < size; k++) {
        for (int j = 0; j < size; j++) {
            int result = (k == 0) ? 0 : temp_sum[j];
            result += A[i][k] * B[k][j];
            temp_sum[j] = result;
            if (k == size - 1) C[i][j] = result;
        }
    }
}

通过将k循环移到中间层,改变了内存访问的模式。现在,对B[k][j]的访问变得连续,因为j循环是最内层。

同时,由于result的计算不再依赖于k循环的前一次迭代结果,因此可以减少依赖性。

+-----------------------+---------+---------+----------+-----------+-----------+------+----------+
|                       |  Latency (cycles) | Iteration|  Initiation Interval  | Trip |          |
|       Loop Name       |   min   |   max   |  Latency |  achieved |   target  | Count| Pipelined|
+-----------------------+---------+---------+----------+-----------+-----------+------+----------+
|- lreorder1_lreorder2  |     1024|     1024|         2|          1|          1|  1024|       yes|
+-----------------------+---------+---------+----------+-----------+-----------+------+----------+

同时减少了资源占用:

================================================================
== Utilization Estimates
================================================================
* Summary: 
+-----------------+---------+------+--------+--------+-----+
|       Name      | BRAM_18K|  DSP |   FF   |   LUT  | URAM|
+-----------------+---------+------+--------+--------+-----+
|DSP              |        -|     -|       -|       -|    -|
|Expression       |        -|     -|       0|    2593|    -|
|FIFO             |        -|     -|       -|       -|    -|
|Instance         |        -|    96|       0|     640|    -|
|Memory           |        -|     -|       -|       -|    -|
|Multiplexer      |        -|     -|       -|      54|    -|
|Register         |        -|     -|    1190|       -|    -|
+-----------------+---------+------+--------+--------+-----+
|Total            |        0|    96|    1190|    3287|    0|
+-----------------+---------+------+--------+--------+-----+
|Available        |      288|  1248|  234240|  117120|   64|
+-----------------+---------+------+--------+--------+-----+
|Utilization (%)  |        0|     7|      ~0|       2|    0|
+-----------------+---------+------+--------+--------+-----+

5. 总结

循环重排优化了内存访问模式,减少了数据依赖性,使得硬件能够更有效地并行处理计算,从而提高了执行效率。II从32降低到了1。

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

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

相关文章

给你的AppImage创建桌面快捷方式

原文链接 https://www.cnblogs.com/HGNET/p/16396589.html 运行环境:Ubuntu 22.04 LTS 1.首先准备好AppImage文件并放在一个你知道的地方 2.打开终端&#xff0c;在/usr/share/applications下新建APP.desktop文件&#xff08;APP可以改成你的应用名称&#xff09; cd /usr/s…

PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

目录 前言 需求场景 用例图 类图 活动图 时序图 前言 在软件开发的生命周期中&#xff0c;需要先进行设计&#xff0c;最后才是进行具体的编码和测试。设计时就需要画各种 UML 图&#xff0c;有专业的 UML 画图软件&#xff0c;也有很多在线的 UML 画图网站可以来画图&a…

数据适配器对象(DataAdapter)

一、DataAdapter对象概述 1、 DataAdapter是一个特殊的类&#xff0c;其作用是数据源与DataSet对象之间沟通的桥梁。 2、 DataAdapter提供了双向的数据传输机制 &#xff08;1&#xff09; 在数据源上执行Select语句&#xff0c;把查询结果集传送到DataSet对象的…

嵌入式webrtc音视频多端p2p sfu传输方案

Webrtc在实时音视频中占据重要位置&#xff0c;在小型嵌入式设备上实现音视频数据的组合传输也越来越成为趋势&#xff0c;通过方便快捷的信令调度&#xff0c;可以实时相互拉取对等方的音视频流也可以通过sfu服务器实现转发。 我们在实践中采用物联网常用的mqtt协议来实现设备…

推荐七个Python效率工具!

为了提高效率&#xff0c;我们在平时工作中常会用到一些Python的效率工具&#xff0c;Python作为比较老的编程语言&#xff0c;它可以实现日常工作的各种自动化。为了更便利的开发项目&#xff0c;这里给大家推荐几个Python的效率工具。 1、Pandas-用于数据分析 Pandas是一个强…

ChatGLM3初体验

mac本地化部署ChatGLM3 写在前面环境准备1. python环境2. 安装第三方依赖torch3.下载模型 代码准备1.clone代码 run效果 写在前面 建议直接去看官方文档 https://github.com/THUDM/ChatGLM3?tabreadme-ov-file 环境准备 1. python环境 python -V ## 3.11.42. 安装第三方依…

c++ - 动态载入DLL接口,可以给IDA静态分析增加一点麻烦

文章目录 c - 动态载入DLL接口&#xff0c;可以给IDA静态分析增加一点麻烦概述笔记测试工程test_load_dll_then_call_api.cppCMyUser32Dll.hCMyUser32Dll.cppLateLoad.hIDA静态分析引入表中没有PostMessageW字符串查找能找到PostMessageW备注看看CMyUser32Dll.h编译完的样子备注…

Rust - 所有权

所有的程序都必须和计算机内存打交道&#xff0c;如何从内存中申请空间来存放程序的运行内容&#xff0c;如何在不需要的时候释放这些空间&#xff0c;成了重中之重&#xff0c;也是所有编程语言设计的难点之一。在计算机语言不断演变过程中&#xff0c;出现了三种流派&#xf…

【JS】数组交换位置

公式 arr.splice(oldIndex, delCount, ...arr.splice(newIndex, delCount, arr[oldIndex])) arr - 操作的数组delCount - 删除的数组个数oldIndex - 交换位置的数组下标1newIndex - 交换位置的数组下标2...arr - 提取数组里的元素 splice删除元素时&#xff0c;返回一个数组&a…

每日一题:缺失的第一个正数

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,2] 中的数字都在数组…

实验笔记之——RGBD GS-ICP SLAM配置与测试

《RGBD GS-ICP SLAM》是最新开源的一个3DGS-SLAM工作&#xff0c;通过利用GICP来实现当前帧gaussian与已mapping的gaussian进行匹配进行位姿的估算&#xff0c;并通过关键帧的选择策略来进一步提升performance~ Use G-ICP to align the current frame with the 3D GS map whic…

计算机网络----第十二天

交换机端口安全技术和链路聚合技术 1、端口隔离技术&#xff1a; 用于在同vlan内部隔离用户&#xff1b; 同一隔离组端口不能通讯&#xff0c;不同隔离组端口可以通讯; 2、链路聚合技术&#xff1a; 含义&#xff1a;把连接到同一台交换机的多个物理端口捆绑为一个逻辑端口…

HLOOKUP函数结合数据验证实现的动态图表

小伙伴们&#xff0c;大家好啊&#xff01;今天我们分享一个使用HLOOKUP函数结合数据验证实现的动态图表技巧&#xff1b; 接下来我们具体说说操作步骤吧。 步骤1&#xff1a;选中A列的【路口车辆通过数】单元格区域&#xff0c;复制粘贴后到右边的空白区域&#xff0c;如I列…

【微服务】------架构设计及常用组件

前言 在当今迅猛发展的软件开发领域&#xff0c;微服务架构已经成为构建灵活、可扩展系统的关键方法之一。本文将带领读者深入了解微服务架构的核心思想&#xff0c;并介绍构建这一架构所需的常用组件&#xff0c;为各位开发者提供全面的指导和洞察力。 BigDiagram 我们从一…

HttpServletRequest/Response

HttpServletRequest 一些常用类的用法 package Demo;import javax.jws.WebService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import ja…

改进YOLOv8系列:结合自研注意力模块MultiScaleAttentiveConv (MSAConv)

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、全局上下文信息注意力Triplet Attention 代码MultiScaleAttentiveConv (MSAConv)本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更…

计算机网络书籍--《网络是怎样连接的》阅读笔记

第一章 浏览器生成信息 1.1 生成HTTP请求信息 1.1.1 URL Uniform Resource Locator, 统一资源定位符。就是网址。 不同的URL能够用来判断使用哪种功能来访问相应的数据&#xff0c;比如访问Web服务器就要用”http:”&#xff0c;而访问FTP服务器用”ftp:”。 FTP&#xff…

笔记本台式机电脑 “睡眠和休眠”有什么区别,那个更省电

笔记本台式机电脑 Windows 系统里睡眠和休眠有什么区别&#xff0c;睡眠和休眠那个更省电&#xff0c;睡眠和休眠使用那个更好&#xff0c;当不用电脑时&#xff0c;通常有三种方式让电脑休息&#xff1a;关机、睡眠和休眠。关机的定义大家都懂&#xff0c;但睡眠和休眠就容易让…

基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例

目录 前言 一、信息网站介绍 1、网站介绍 2、 地震历史信息 3、 历史信息接口分析 二、XxlCrawler组件 1、关于XxlCrawler 2、核心概念介绍 三、实际信息爬取 1、新建maven项目 2、新建model层对象 3、实际爬取 总结 前言 如今&#xff0c;只要谈起网络信息爬取也就…

MathJax —— Vue3的使用方法

版本&#xff1a; mathjax3 需要实现效果 一、使用方式 1. index.html 中引入 <!-- 识别单行&#xff0c;行内&#xff0c;\( \)样式的公式 --><script>MathJax {tex: {inlineMath: [[$, $],[$$, $$], [\\(, \\)]]},};</script><script id"MathJ…