Vitis HLS 學習筆記--控制驅動TLP-處理deadlock

目錄

1. 簡介

2. 代碼解析

2.1 HLS kernel代碼

2.2 查看接口報告

2.3 TestBench

2.4 Dataflow 報告

3. Takeaways

4. 總結


1. 簡介

本文是對《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》實驗內容的詳細解釋。

首先需要了解,鑒于數據流優化具有動態特性,且不同并行任務的執行速度各不相同,設置不當的數據流通道可能會引發性能下降或死鎖。

數據流通道有兩種:FIFO 和 PIPO。可以由工具推斷,或者用戶自行創建。

FIFO:

  • Streams (including hls::streams and streamed arrays),用戶創建。
  • Scalar propagation FIFOs,工具推斷。
  • Streams of blocks,用戶創建。

每個通道都有自己的握手信號。因為:

  • 它們的讀寫操作是被調度的。
  • 它們的讀/寫信號分別由流水線控制或有限狀態機(FSM)單獨驅動。
  • 它們的full_n/empty_n信號直接使流水線的單個迭代或FSM的狀態暫停。

PIPO:

  • PIPO,用戶創建。
  • Task Level FIFOs (TLF),工具推斷。
  • Input and output ports to the upper level,用戶創建。

其中,Task Level FIFOs (TLF) 是標量(scalar)FIFO,其連接到生產者的“done”握手信號以進行寫入,并連接到消費者的“start”握手信號以進行讀取。這些類型的FIFO是由工具自動推斷的。由于底層同步機制的緣故,它們被視為類PIPO。

這些通道應該被視為“使用ap_ctrl_chain握手的通道”,因為:

  • 它們的寫入和讀取操作不會被調度。它們隱式地與進程的“done”握手或“start”握手相關聯。
  • 它們的寫入和讀取信號分別連接到ap_done和ap_ready。
  • 它們的full_n和empty_n分別連接到ap_continue和ap_start。

總結一下,在分析存儲深度、性能、死鎖等方面,真正需要關系的是:

  • 通道是否擁有自己的握手機制(FIFOs)。它們的訪問在其進程執行期間被分散開來。例如,你可以在管道的第一個II之外讀取一個FIFO,或者甚至在數據流網絡的最后一個過程中讀取。
  • 通道是否通過ap_ctrl_chain進行握手(PIPOs)。它們的讀取必須在管道的第一個II中,或者在數據流網絡的第一個“層級”的過程中進行,類似地,它們的寫入必須在最后一個II或在最后一個“層級”中進行。
  • 另一個區別基于一次操作中傳輸的數據量,這對于資源分析比對性能分析更為重要:對于PIPOs來說是數組,對于流來說是塊流、標量流,對于標量傳播FIFOs和任務級FIFOs來說是標量。

2. 代碼解析

2.1 HLS kernel代碼

#include "example.h"void example(hls::stream<int>& A, hls::stream<int>& B){
#pragma HLS dataflow
#pragma HLS INTERFACE ap_fifo port=A
#pragma HLS INTERFACE ap_fifo port=Bhls::stream<int> data_channel1;hls::stream<int> data_channel2;proc_1(A, data_channel1, data_channel2);proc_2(data_channel1, data_channel2, B);
}void proc_1(hls::stream<int>& A, hls::stream<int>& B, hls::stream<int>& C){
#pragma HLS dataflowhls::stream<int> data_channel1;hls::stream<int> data_channel2;proc_1_1(A, data_channel1, data_channel2);proc_1_2(B, C, data_channel1, data_channel2);
}void proc_1_1(hls::stream<int>& A, hls::stream<int>& data_channel1, hls::stream<int>& data_channel2){int i;int tmp;for(i = 0; i < 10; i++){tmp = A.read();data_channel1.write(tmp); }for(i = 0; i < 10; i++){data_channel2.write(tmp); }
}void proc_1_2(hls::stream<int>& B, hls::stream<int>& C, hls::stream<int>& data_channel1, hls::stream<int>& data_channel2){int i;int tmp;for(i = 0; i < 10; i++){tmp = data_channel2.read() + data_channel1.read();B.write(tmp);}for(i = 0; i < 10; i++){C.write(tmp); }
}void proc_2(hls::stream<int>& A, hls::stream<int>& B, hls::stream<int>& C){
#pragma HLS dataflowhls::stream<int> data_channel1;hls::stream<int> data_channel2;proc_2_1(A, B, data_channel1, data_channel2);proc_2_2(C, data_channel1, data_channel2);
}void proc_2_1(hls::stream<int>& A, hls::stream<int>& B, hls::stream<int>& data_channel1, hls::stream<int>& data_channel2){int i;int tmp;for(i = 0; i < 10; i++){tmp = A.read() + B.read();data_channel1.write(tmp); }for(i = 0; i < 10; i++){data_channel2.write(tmp); }
}void proc_2_2(hls::stream<int>& C, hls::stream<int>& data_channel1, hls::stream<int>& data_channel2){int i;int tmp;for(i = 0; i < 10; i++){tmp = data_channel2.read() + data_channel1.read();C.write(tmp);}
}

與原示例相比,去掉了“&”符號。

#pragma HLS INTERFACE ap_fifo port=&A
#pragma HLS INTERFACE ap_fifo port=&B

以上 kernel 的功能框圖:

2.2 查看接口報告

對于頂層文件,可以查看 example_csynth.rpt,觀察頂層接口:

================================================================
== Interface
================================================================
* Summary: 
+-----------+-----+-----+------------+--------------+--------------+
| RTL Ports | Dir | Bits|  Protocol  | Source Object|    C Type    |
+-----------+-----+-----+------------+--------------+--------------+
|A_dout     |   in|   32|     ap_fifo|             A|       pointer|
|A_empty_n  |   in|    1|     ap_fifo|             A|       pointer|
|A_read     |  out|    1|     ap_fifo|             A|       pointer|
|B_din      |  out|   32|     ap_fifo|             B|       pointer|
|B_full_n   |   in|    1|     ap_fifo|             B|       pointer|
|B_write    |  out|    1|     ap_fifo|             B|       pointer|
|ap_clk     |   in|    1|  ap_ctrl_hs|       example|  return value|
|ap_rst     |   in|    1|  ap_ctrl_hs|       example|  return value|
|ap_start   |   in|    1|  ap_ctrl_hs|       example|  return value|
|ap_done    |  out|    1|  ap_ctrl_hs|       example|  return value|
|ap_ready   |  out|    1|  ap_ctrl_hs|       example|  return value|
|ap_idle    |  out|    1|  ap_ctrl_hs|       example|  return value|
+-----------+-----+-----+------------+--------------+--------------+

?針對 Dataflow 區域的每個函數體,均有對應的 Interface:

================================================================
== Interface
================================================================
* Summary: 
+-------------------------------+-----+-----+------------+----------------+--------------+
|           RTL Ports           | Dir | Bits|  Protocol  |  Source Object |    C Type    |
+-------------------------------+-----+-----+------------+----------------+--------------+
|ap_clk                         |   in|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_rst                         |   in|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_start                       |   in|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|start_full_n                   |   in|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_done                        |  out|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_continue                    |   in|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_idle                        |  out|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|ap_ready                       |  out|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|start_out                      |  out|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|start_write                    |  out|    1|  ap_ctrl_hs|        proc_1_1|  return value|
|A_dout                         |   in|   32|     ap_fifo|               A|       pointer|
|A_empty_n                      |   in|    1|     ap_fifo|               A|       pointer|
|A_read                         |  out|    1|     ap_fifo|               A|       pointer|
|data_channel12_din             |  out|   32|     ap_fifo|  data_channel12|       pointer|
|data_channel12_num_data_valid  |   in|    2|     ap_fifo|  data_channel12|       pointer|
|data_channel12_fifo_cap        |   in|    2|     ap_fifo|  data_channel12|       pointer|
|data_channel12_full_n          |   in|    1|     ap_fifo|  data_channel12|       pointer|
|data_channel12_write           |  out|    1|     ap_fifo|  data_channel12|       pointer|
|data_channel23_din             |  out|   32|     ap_fifo|  data_channel23|       pointer|
|data_channel23_num_data_valid  |   in|    2|     ap_fifo|  data_channel23|       pointer|
|data_channel23_fifo_cap        |   in|    2|     ap_fifo|  data_channel23|       pointer|
|data_channel23_full_n          |   in|    1|     ap_fifo|  data_channel23|       pointer|
|data_channel23_write           |  out|    1|     ap_fifo|  data_channel23|       pointer|
+-------------------------------+-----+-----+------------+----------------+--------------+

上述報告 Source??Object 所在列:

  • A - >?hls::stream<int>& A, C type 為 pointer
  • data_channel12 ->?hls::stream<int>& data_channel1, C type 為 pointer
  • data_channel23 ->?hls::stream<int>& data_channel2, C type 為 pointer
?
void proc_1_1(hls::stream<int>& A, hls::stream<int>& data_channel1, hls::stream<int>& data_channel2){int i;int tmp;for(i = 0; i < 10; i++){tmp = A.read();data_channel1.write(tmp);}for(i = 0; i < 10; i++){data_channel2.write(tmp);}
}

2.3 TestBench

#include <stdio.h>
#include "hls_stream.h"#define SIZE 10
extern void example(hls::stream<int>& A, hls::stream<int>& B);int main()
{int i;hls::stream<int> A;hls::stream<int> B;int time = 0;for   (time = 0 ; time < 4; time ++) {for(i=0; i < SIZE; i++){A << (i + time);}example(A,B);}return 0;
}

2.4 Dataflow 報告

運行 C Synthesis 后,可以查看 Dataflow 報告,如下圖,沒有問題。

在運行 C/RTL Cosimulation 后,同樣在 Dataflow 報告中可以看到錯誤。

3. Takeaways

總結而言,Dataflow查看器實現了以下吞吐量分析任務:

圖表展示了 DATAFLOW 區域的整體拓撲結構,并顯示了在 DATAFLOW 區域中任務之間用于通信的通道類型(FIFO/PIPO)。通過分析每個通道和進程,可以有效地解決死鎖或由于FIFO大小不當導致的吞吐量不足等問題。

協同仿真數據通過在仿真過程中跟蹤FIFO的最大使用量,為解決FIFO大小設置問題提供了參考依據,從而幫助用戶調整FIFO大小。此外,運行協同仿真時的自動死鎖檢測功能能夠突出顯示涉及死鎖的進程和通道,使用戶能夠快速定位并解決這些問題。

除了 FIFO 大小的調整,協同仿真后的數據還能按每個進程和通道報告因等待輸入或輸出而導致的停滯時間。這些圖表幫助用戶理解并解決這些問題,同時管理通道大小以滿足慢速生產者與快速消費者之間的需求,或者相反。此外,圖表還揭示了在DATAFLOW區域中途讀取輸入如何影響整體性能,這是一個常見的場景,可能會對性能產生重大影響。

4. 總結

在數據流優化中,通道類型、握手機制、FIFO大小和死鎖避免都是關鍵因素。通過Dataflow查看器和協同仿真數據,您可以有效地優化設計,提高性能并避免潛在問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15939.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何實現高內聚低耦合

一、定義 內聚&#xff1a;一個模塊內各元素間&#xff0c;結合的緊密程度。 耦合&#xff1a;模塊之間聯系緊密程度 二、高內聚、低耦合的利弊 1、代碼關系過于緊密&#xff0c;往往改一小段代碼&#xff0c;需要整個項目做很大的改動。所以在實際開發中應該盡量避免過高的…

Python常見面試題(二)——numpy和pandas

一、NumPy和Pandas間的區別與練習 功能定位 NumPy主要用于數值計算&#xff0c;提供了多維數組對象ndarray&#xff0c;支持數組操作、線性代數、隨機數生成等功能。 Pandas則建立在NumPy之上&#xff0c;提供了更高級的數據結構&#xff0c;主要用于數據分析&#xff0c;尤…

自動駕駛場景中的長尾問題怎么解決?

自動駕駛長尾問題是指自動駕駛汽車中的邊緣情況&#xff0c;即發生概率較低的可能場景。感知的長尾問題是當前限制單車智能自動駕駛車輛運行設計域的主要原因之一。自動駕駛的底層架構和大部分技術問題已經被解決&#xff0c;剩下的5%的長尾問題&#xff0c;逐漸成了制約自動駕…

huggingface 筆記:查看GPU占用情況

0 準備部分 0.1 創建虛擬數據 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

學習和分享關于 Vue.js 的路由(vue-router)

學習和分享關于 Vue.js 的路由&#xff08;vue-router&#xff09;是一個非常有價值的主題&#xff0c;因為路由是構建單頁應用程序&#xff08;SPA&#xff09;的核心部分。本文將介紹 Vue.js 路由的基本概念和實現&#xff0c;并展示一個典型的項目目錄結構。 目錄 Vue.js 路…

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39, 41, 131

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39&#xff0c; 41&#xff0c; 131 需強化知識點 startInex作用&#xff1a;一是處理是否可以有重復值&#xff0c;二是實現縱向遍歷&#xff08;不能沒有&#xff09;去重要在數組有序的前提下進行分割問題 題目 39.…

工業控制2D組態界面,丑是丑了點,但非常實用。

工業控制的2D組態界面是用于監控和控制工業過程的界面。它通常具有以下特征&#xff1a; 實時數據顯示&#xff1a;2D組態界面能夠實時顯示傳感器和設備的數據&#xff0c;如溫度、壓力、流量等。這些數據以圖表、儀表盤、數字顯示等形式呈現&#xff0c;使操作人員能夠實時了解…

Android:使用Kotlin搭建MVVM架構模式

一、簡介Android MVVM架構模式 MVVM全稱&#xff1a;Model、View、ViewModel&#xff1b; Model&#xff1a;負責數據的請求、解析、過濾等數據層操作&#xff0c;其中Repository: 提供數據的 API&#xff08;從本地或者網絡&#xff09;。View&#xff1a;負責視圖部分展示Vie…

Spring (18)什么是JdbcTemplate

JdbcTemplate 是 Spring 框架提供的一個主要的類&#xff0c;旨在簡化傳統 JDBC 的使用。它處理了諸如連接管理、異常處理等繁瑣的低級任務&#xff0c;讓開發者可以更專注于執行 SQL 語句和處理結果。JdbcTemplate 屬于 Spring JDBC 模塊&#xff08;spring-jdbc&#xff09;&…

每日力扣刷題day05(小白簡單題)

文章目錄 2024.5.26&#xff08;5題&#xff09;1446.連續字符題解一題解二 2824.統計和小于目標的下標對數目題解一題解二 1768.交替合并字符串題解一題解二題解三 796.旋轉字符串題解一題解二 1304.和為零的 N 個不同整數題解一題解二 2024.5.26&#xff08;5題&#xff09; …

快速冪求逆元與逆元

我上一篇博客鏈接寫的是多個數求乘法逆元而快速冪求逆元用于單個數求乘法逆元 逆元是對分數取模用的 對于除法取模不成立&#xff0c;即(a/b)%p≠(a%p/b%p)%p。求逆元的思路&#xff1a;(一般ACM的題目都是對1e97這種素數取模&#xff0c;所以gcd(a,p)1)a*b1(mod p) > b1/a…

[Algorithm][動態規劃][簡單多狀態DP問題][按摩師][打家劫舍Ⅱ][刪除并獲得點數][粉刷房子]詳細講解

目錄 1.按摩師1.題目鏈接2.算法思路詳解3.代碼實現 2.打家劫舍 II1.題目鏈接2.算法思路詳解3.代碼實現 3.刪除并獲得點數1.題目鏈接2.算法思路詳解3.代碼實現 4.粉刷房子1.題目鏈接2.算法思路詳解3.代碼實現 1.按摩師 1.題目鏈接 按摩師 2.算法思路詳解 思路&#xff1a; 確…

大模型提示詞Prompt學習

引言 關于chatGPT的Prompt Engineer&#xff0c;大家肯定耳朵都聽起繭了。但是它的來由&#xff1f;&#xff0c;怎么能用好&#xff1f;很多人可能并不覺得并不是一個問題&#xff0c;或者說認定是一個很快會過時的概念。但其實也不能說得非常清楚&#xff08;因為覺得沒必要深…

Redis第18講——Redis和Redission實現延遲消息

即使不是做電商業務的同學&#xff0c;也一定知道訂單超時關閉這種業務場景&#xff0c;這個場景大致就是用戶下單后&#xff0c;如果在一定時間內未支付&#xff08;比如15分鐘、半小時&#xff09;&#xff0c;那么系統就會把這筆訂單給關閉掉。這個功能實現的方式有很多種&a…

unity開發Hololens 制作滑動框

一定要做到最后一步&#xff0c;才會有效果 1、創建空物體 ,并添加組件 創建空物體 命名ScrollingObjectCollection&#xff0c; 添加組件如下圖 下面是各個組件展開的內容 2、在ScrollingObjectCollection 下面創建兩個空物體&#xff0c;分別命名Container、Clipping…

運籌說 第115期 | 排隊論經典例題講解

通過前幾期的學習&#xff0c;我們已經學會了排隊論的基本概念、生滅過程和Poisson過程&#xff0c;等待制排隊模型、混合制排隊模型、其他排隊模型以及排隊系統優的定義與相關求解方法。在實際工作中&#xff0c;我們能發現排隊論在經濟管理中有著許多應用&#xff0c;本期小編…

大數據量上傳FTP

背景 筆者有一個需求是把將近一億條數據上傳到FTP服務器中&#xff0c;這些數據目前是存儲在mysql中&#xff0c;是通過關聯幾張表查詢出來的&#xff0c;查詢出來的數據結果集一共是6個字段。要求傳輸的時候拆分成一個個小文件&#xff0c;每個文件大小不能超過500M。我的測試…

FuTalk設計周刊-Vol.052

#AI漫談 熱點捕手 1.ChatGPT 大更新&#xff01;GPT-4 開始又變聰明了 OpenAI 官方宣布&#xff0c;新版 GPT-4 Turbo 今天開始向所有付費 ChatGPT 用戶開放。 鏈接https://www.pconline.com.cn/focus/1733/17330089.html 2.刷爆多模態任務榜單&#xff01;賈佳亞團隊Mini-G…

Linux下環境變量配置出錯導致基礎命令使用不了的問題解決

問題&#xff1a; 當配置環境變量&#xff1a; echo export PATH/home/ubuntu/.local/lib/python3.8/site-packages :$PATH >> ~/.bashrc 執行生效命令 source ~/.bashrc 出現所有的基礎操作命令&#xff1a;ls vim都使用不了 解決方式&#xff1a; 1&#xff09…

21.2zabbix低級自動發現-mysql多實例

配置mysql多實例 注釋&#xff1a;自動發現&#xff1a;創建監控主機&#xff1b;低級自動發現&#xff1a;創建監控項 mysql單實例是直接yum安裝&#xff0c;開啟mysql多實例 準備配置文件 #mysql3307實例 cp /etc/my.cnf /etc/my3307.cnf vim /etc/my3307.cnf [mysqld] dat…