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.pswp.cn/web/13385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13385.shtml
英文地址,請注明出處:http://en.pswp.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;在微軟威脅建模工具中用于表…