精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Helium技術講堂—循環緩沖區的使用

瑞薩MCU小百科 ? 來源:Arm社區 ? 2024-03-11 13:39 ? 次閱讀

RA8系列是瑞薩電子推出的全新超高性能產品業界首款基于Arm Cortex-M85處理器MCU,能夠提供卓越的6.39 CoreMark/MHz,可滿足工業自動化、家電、智能家居消費電子、樓宇/家庭自動化、醫療等廣泛應用的各類圖形顯示和語音/視覺多模態AI要求。

所有RA8系列MCU均利用Arm Cortex-M85處理器和Arm的Helium技術所帶來的高性能,結合矢量/SIMD指令集擴展,能夠在數字信號處理器(DSP)和機器學習(ML)的實施方面獲得相比Cortex-M7內核高4倍的性能提升。

f5cc32ac-df61-11ee-a297-92fbcf53809c.png

人工智能 (AI) 下沉到各式各樣的應用當中,作為市場上最大量的物聯網設備也將被賦予智能性。ArmHelium 技術正是為基于Arm Cortex-M 處理器的設備帶來關鍵機器學習與數字信號處理的性能提升。

在上周的 Helium 技術講堂中,我們與大家共同探討了復雜而又有趣的交錯加載/存儲指令。今天,我們將一起聊聊與內存訪問相關的內容。若您想要了解如何高效利用 Helium,千萬別錯過文末視頻,通過 Arm 技術專家的實例演示,詳解 Helium 如何為端點設備引入更多智能。

Arm Helium 技術誕生的由來

循環緩沖區的使用

作者:Arm 架構與技術部高級首席工程師 Fran?ois Botman

我們在為 Arm Cortex-M 處理器系列設計矢量擴展 (MVE) —— Arm Helium 技術時,希望它能廣泛地適用于各種數字信號處理 (DSP) 的應用。具備高效的數據計算能力只成功了一半,同樣重要的是具備在內存中訪問和存儲這些數據的能力。

正如之前的文章內容所述,Helium 是一種四節拍矢量架構。將數據加載到矢量中的最直接的方法是連續加載操作(見圖一)。在每個節拍中,都從標量寄存器中指定的基址開始依次訪問內存。無論目標數據類型如何(8、16 或 32 位),都可以通過充分利用總線寬度的訪問來高效地執行這一操作,因為數據元素在內存和矢量中都是相鄰的,存儲操作也是如此。

f5d5bcfa-df61-11ee-a297-92fbcf53809c.png

圖一:連續加載操作

內存是一種稀缺資源,通常情況下,要盡可能緊湊地打包數據,使用可容納數據的最小數據類型。不過,在處理數據時,可能需要更多的空間,以避免在計算的中間階段出現溢出。這可以作為一個獨立的拓寬指令來執行,但正如本系列第一篇文章所述,它存在時間跨越問題(對于 8 到 32 位的擴展,將數據擴展到最后一節拍需要第一節拍的數據,而第一節拍的數據已不可用)。

因此,擴展指令不能與其他指令重疊,否則會對性能產生不利影響。相反,Helium 引入了改變大小的內存操作。數據可以作為單個 8、16 或 32 位訪問,針對每個節拍高效加載,并用零或符號擴展,以匹配所需的數據類型。在圖二的示例中,我們希望執行將每個矢量通道的 8 位加載擴展到 16 位。兩個 8 位數據樣本作為一個 16 位加載操作加載,每個樣本在寫入矢量通道之前擴展到 16 位。同樣,對于存儲來說,數據可以截斷到所需的大小,實現高效存儲。

f5e00e62-df61-11ee-a297-92fbcf53809c.png

圖二:加載擴展

Helium 加載和存儲指令具有與 M 系列架構的其他部分相同的豐富的尋址模式集,支持預遞增或后遞增以及指針回寫等功能。這樣,在大多數情況下就不需要單獨進行指針操作了。

DSP 應用通常在數據結構而非單個元素上運行。例如,立體聲音頻數據通常以左右數值交織流的形式存儲。同樣,圖像數據通常以紅、綠、藍、Alpha 交錯值的形式存儲。這是上一篇文章的主題內容,其中介紹了可以有效實現這一目標的結構化加載/存儲指令。

有時,存儲在內存中的數據無法以便捷的方式構建以實現連續訪問。在某些架構中,這實際上會阻礙代碼的矢量化。Helium 通過“離散?聚合”操作解決了這一問題。這些操作將偏移矢量指向內存,這樣就可以用一條指令訪問多個非連續地址(見圖三)。它們還能擴展或截斷所訪問的數據。

f5ebff4c-df61-11ee-a297-92fbcf53809c.png

圖三:匯總負載

“離散-聚合”操作是一種功能強大的指令,可為應用提供很大的靈活性。例如,它們幾乎是實現 FFT(快速傅里葉變換)不可或缺的工具;在這種算法中,第一個或最后一個蝴蝶階段的內存訪問需要使用反位尋址執行。專用反位指令 (VBRSR) 生成反位尋址模式,供這些離散-聚合指令使用。

為了提高性能,這些指令重疊執行,加載數據的效率遠遠超過同等序列的標量指令。而且,它們也更容易使用。雖然連續矢量訪問能為規律模式提供更好的性能,但由于離散-聚合指令無法對數據布局做出假設,因此有多少個不同的元素,匯總加載指令就必須執行多少次單獨的訪問。對于 8 位數據,訪問次數可能多達 16 次,這就成了不斷加載的負載。

DSP 應用通常使用一種稱為循環尋址的內存布局。可以按順序訪問元素,但最多只能訪問配置的緩沖區大小,之后的訪問會繞回到第一個元素(見圖四)。例如,從元素 N?1 開始的四元素讀取操作將會訪問元素 N?1, 0, 1, 2。

f5f6cbca-df61-11ee-a297-92fbcf53809c.png

圖四:循環緩沖區示例

這在 DSP 應用中用途廣泛,包括在處理數據流后只需要前 N 個數據樣本時避免指針操作。在 FIR 濾波器中,最后 N 個數據樣本需要與一組系數相乘,才能產生所需的濾波器響應。當一個新的數據樣本到來時,需要處理的是之前的 N?1 個樣本和新樣本,最舊的樣本不再使用。數據可以重新排列,使要處理的緩沖區總是按正確的順序包含元素,但這需要在開始處理前將每個樣本復制到不同的位置,耗費大量資源。如果使用循環緩沖區,就可以就地訪問數據,必要時還可以繞回到開頭,而且只需要寫入一次就可以用最新的樣本替換最舊的樣本。

一些 DSP 通過專用訪問指令和專用寄存器來實現循環緩沖區的起始地址和結束地址。指針每次遞增時,硬件都會將其與結束地址進行比較,并相應地回繞。這意味著同時支持的循環緩沖區數量受到可用硬件的限制。這也意味著每次中斷都需要保留大量額外狀態,而這會影響延遲。

為此,所需的硬件支持不容忽視;在典型的實施中,需要更復雜的地址生成單元。為了避免這種情況,一些 DSP 要求循環緩沖區的大小等于 2 的冪次方,緩沖區的地址調整為該大小的倍數。可以通過將指針與位掩碼進行 AND 運算實現,從而簡化硬件要求。但是,這樣會限制這些緩沖區的放置和使用,特別是幾乎無法直接從高級語言使用緩沖區。由于 M 系列的宗旨是讓一切都能通過 C 語言輕松使用,因此我們需要想出一種更好的方法。

我們的解決方案是將循環緩沖區分成兩個不同的操作,其方式與上文討論的反位尋址類似。我們將用于生成回繞偏移的指令與離散?聚合指令相結合來訪問這些偏移地址的數據。這就為緩沖區大小和位置提供了靈活性,而且關鍵路徑上也不需要有專用硬件。循環緩沖區生成指令 (VIWDUP) 可創建一個矢量,其中包含一連串遞增的偏移量,當到達終點位置時會回繞到開頭(見圖五)。該指令用從 R0 值開始的序列填充矢量寄存器 Q0,并在達到 R1 值時回繞。然后,它將更新后的起始偏移量 2 寫回 R0。這條指令的一個巧妙設計是,每次寫入 Q0 的偏移量矢量都是由標量值重新生成的。

通常下一條指令就是使用偏移量的離散?聚合指令,因此 Q0 可以直接重復用于其他目的。立即值指定偏移量的增量,這對于處理不同的元素大小非常有用。例如,如果加載的是 32 位數值,將使用四個字節的增量。可以指定任意增量或減量,因此該指令可用于其他需要通用數字模式的情況。通過這種方式,Helium 可以提供任意數量的循環緩沖區,在內存中具有靈活的大小、方向和對齊方式,而且這個過程只需要使用現有的硬件就可以提供序列生成指令。

f60a7d64-df61-11ee-a297-92fbcf53809c.png

圖五:序列生成指令的操作示例

那么性能表現如何呢?雖然需要額外的偏移生成指令 (VIWDUP),但我們發現在許多情況下,可能會因為與內存訪問本身重疊而隱藏了開銷。在所有情況下,這一開銷都小于在沒有硬件支持的情況下管理回繞的計算工作量。我們之前也說過,出于性能考慮,最好使用連續訪問。循環緩沖區的特別之處在于,大部分訪問都是連續的,只有偶爾發生回繞時才會出現不連續。一種方法是離散-聚合指令比較偏移值,然后合并連續的訪問。遺憾的是,這樣做將需要大量額外的硬件,并給設計的關鍵部分增加許多額外的復雜性。在負載連續的情況下,離散?聚合操作會降低性能,這違背了我們追求將每個 gate 的性能發揮到極致的原則。

當我們試圖找到解決這個問題的方法時,我們注意到偏移生成指令 (VIWDUP) 已經掌握回繞點的位置。如果能將這一信息傳遞給離散-聚合指令,它就能將訪問提升為連續訪問,而無需使用昂貴又耗時的偏移比較器。那么我們能不能指定一個額外的標量寄存器來傳輸這些信息呢?遺憾的是,這將增加所需的讀取端口數量,而且標量依賴關系從 VIWDUP 改為離散?聚合指令將會導致指令無法重疊。

Helium 實現是否可以將這些信息存儲在隱藏的微架構元數據中,并在矢量發生修改時清除元數據?一般不建議這樣做,因為元數據需要在中斷時保留,而這會影響延遲。但我們發現,在這種情況下,我們不需要保留元數據。在出現異常的極少數情況時,備選措施是正常執行離散-聚合,而不是優化連續訪問。通過使用易失性隱藏元數據來指示連續訪問,可以優化普通非回繞情況下的性能,同時避免出現額外的架構狀態和中斷延遲。

在受限的環境中工作極具挑戰性,Helium 要求我們不斷尋找創新的解決方案,充分發揮硬件性能。我們努力聯合設計架構和微架構,尋找一系列內存訪問指令,既能滿足 DSP 應用的需要,又能最大限度地減少實現這些指令所需的硬件數量。特別是在循環緩沖區方面,我們延續了 M 系列的傳統,確保每個 gate 都物盡其用,從而以較低的面積實現性能表現,同時為終端用戶提供良好的體驗感。

您是否想要更深入了解 Helium 技術?由 Arm 物聯網事業部技術管理總監 Mark Quartermain 與 Arm 物聯網事業部嵌入式工具集成高級經理 Matthias Hertel 共同為大家錄制了 Helium 技術視頻,通過實例演示詳解如何高效利用 Helium。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19178

    瀏覽量

    229200
  • 寄存器
    +關注

    關注

    31

    文章

    5325

    瀏覽量

    120048
  • 人工智能
    +關注

    關注

    1791

    文章

    46896

    瀏覽量

    237657
  • 機器學習
    +關注

    關注

    66

    文章

    8382

    瀏覽量

    132438
  • 快速傅里葉變換

    關注

    0

    文章

    13

    瀏覽量

    1681

原文標題:Helium技術講堂 | 循環緩沖區的使用

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于C語言實現環形緩沖區/循環隊列

    這里分享一個自己用純C實現的環形緩沖區
    的頭像 發表于 04-11 10:39 ?3186次閱讀
    基于C語言實現環形<b class='flag-5'>緩沖區</b>/<b class='flag-5'>循環</b>隊列

    基于宏高效實現環形緩沖區教程

    來源 | 小麥大叔 循環緩沖區是嵌入式軟件工程師在日常開發過程中的關鍵組件。 多年來,互聯網上出現了許多不同的循環緩沖區實現和示例。我非常喜歡這個模塊,可以GitHub上找到這個開源的
    的頭像 發表于 09-02 09:24 ?6712次閱讀
    基于宏高效實現環形<b class='flag-5'>緩沖區</b>教程

    環形緩沖區簡介

    程序中,經常使用環形緩沖器作為數據結構來存放通信中發送和接收的數據。環形緩沖區是一個先進先出的循環緩沖區,可以向通信程序提供對緩沖區的互斥訪
    發表于 08-17 06:56

    請問串口的DMA接收緩沖區是不是環形緩沖區

    大家好!請問串口的DMA接收緩沖區是不是環形緩沖區?通過閱讀串口部分的代碼,我了解到這樣幾點:1、串口的DMA接收時循環接收,當緩沖區滿了會重新從頭開始覆蓋掉之前的數據,和環形
    發表于 08-30 14:27

    DMA循環緩沖區如何重置起點?

    ){head_index = (head_index + dma_buffer_interrupt_size) % uartsize;}我遇到的問題是,當我設置一個循環緩沖區時,一旦它進入
    發表于 12-13 08:22

    基于狀態圖的緩沖區溢出攻擊分析

    結合緩沖區溢出攻擊產生的原理,分析緩沖區溢出攻擊代碼的結構,論述Snort規則對緩沖區溢出攻擊的檢測,在此基礎上構建一個基于狀態圖的緩沖區溢出攻擊的分析模型。該模型對
    發表于 04-10 08:46 ?32次下載

    緩沖區溢出攻擊的防護技術分析

    緩沖區溢出攻擊已經成為網絡攻擊的主要方式。本文首先分析了緩沖區溢出攻擊的基本原理,然后分析了形成緩沖區溢出攻擊的必要條件,并詳細討論了溢出攻擊的防護技術
    發表于 09-02 10:50 ?9次下載

    緩沖區溢出攻擊的原理和防范技術分析

    基于解決緩沖區溢出這一普遍發生的網絡安全漏洞的目的,通過軟件、硬件技術層面的驗證方法,結合人工檢查、靜態發現技術、動態防御技術等實驗手段,得出了在向
    發表于 05-27 16:20 ?17次下載

    環形緩沖區的實現原理

    在通信程序中,經常使用環形緩沖區作為數據結構來存放通信中發送和接收的數據。環形緩沖區是一個先進先出的循環緩沖區,可以向通信程序提供對緩沖區
    的頭像 發表于 03-22 10:03 ?7498次閱讀
    環形<b class='flag-5'>緩沖區</b>的實現原理

    緩沖區是啥意思 STM32串口數據接收之環形緩沖區

    緩沖區顧名思義是緩沖數據用的。實現緩沖區最簡單的辦法時,定義多個數組,接收一包數據到數組A,就把接收數據的地址換成數組B,每個數據有個標記字節用于表示這個數組是否收到數據,收到數據是否處理
    的頭像 發表于 07-22 15:33 ?1.1w次閱讀

    STM32串口數據接收 --環形緩沖區

    程序中,經常使用環形緩沖器作為數據結構來存放通信中發送和接收的數據。環形緩沖區是一個先進先出的循環緩沖區,可以向通信程序提供對緩沖區的互斥訪
    發表于 12-28 19:24 ?30次下載
    STM32串口數據接收 --環形<b class='flag-5'>緩沖區</b>

    什么是緩沖區?有什么作用

    緩沖區其實就是一個存儲區域,它是由專門的硬件寄存器所組成的。
    的頭像 發表于 02-02 09:57 ?2.5w次閱讀

    基于C語言的循環隊列緩沖區原理、設計與實現

    在FPGA中,FIFO一般是使用RAM存儲器作為緩沖區,可以分為同步FIFO或異步FIO,一般用于數據緩沖,或者不同時鐘域之間的數據傳遞。
    發表于 04-10 09:30 ?1051次閱讀

    C++環形緩沖區設計與實現

    Buffer) 環形緩沖區(Circular Buffer),也被稱為循環緩沖區(Cyclic Buffer)或者環形隊列(Ring Buffer),是一種數據結構類型,它在內存中形成一個環形
    的頭像 發表于 11-09 11:21 ?1873次閱讀
    C++環形<b class='flag-5'>緩沖區</b>設計與實現

    交換芯片緩沖區大小是什么

    交換芯片緩沖區大小并不一定是固定的。緩沖區的設計和實現會根據芯片的具體型號、規格以及應用場景的不同而有所差異。一些交換芯片可能具有固定大小的緩沖區,以滿足特定的性能需求或成本限制。然而,隨著
    的頭像 發表于 03-18 14:42 ?552次閱讀