<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 物聯(lián)網(wǎng)與傳感器 > 設計應用 > Helium 技術(shù)講堂 | 克服 Amdahl 定律的影響

Helium 技術(shù)講堂 | 克服 Amdahl 定律的影響

作者: 時(shí)間:2024-09-04 來(lái)源:Arm 收藏

當人工智能 (AI) 下沉到各式各樣的應用當中,作為市場(chǎng)上最大量的物聯(lián)網(wǎng)設備也將被賦予智能性。 ? 技術(shù)正是為基于  Cortex -M 處理器的設備帶來(lái)關(guān)鍵機器學(xué)習與數字信號處理的性能提升。

本文引用地址:http://dyxdggzs.com/article/202409/462642.htm

上周,我們聊了聊 與內存訪(fǎng)問(wèn)相關(guān) 的內容。最后一期的 技術(shù)講堂, 我們將要了解如何克服阿姆達爾 () 定律的影響。 若您想要了解如何高效利用 ,千萬(wàn)別錯過(guò)文末視頻,通過(guò) 技術(shù)專(zhuān)家的實(shí)例演示,詳解 Helium 如何為端點(diǎn)設備引入更多智能。

Arm Helium 技術(shù)誕生的由來(lái)

克服 定律的影響

作者:Arm 架構與技術(shù)部 M 系列首席架構師兼研究員 Thomas Grocutt

在前幾篇文章中,我們介紹了采用 Arm Helium 技術(shù)(也稱(chēng)為 MVE)的 Armv8.1-M 架構如何處理矢量指令。但問(wèn)題是,每當代碼被矢量化時(shí), 定律的影響很快便會(huì )顯現,讓人措手不及。如果您不了解 Amdahl 定律,可以簡(jiǎn)單理解為, Amdahl 定律表明算法中無(wú)法并行化的部分很快就會(huì )成為性能瓶頸。 例如,如果有 50% 的工作負載可以并行化,那么即使這部分工作負載可以無(wú)限并行,最多也只能將速度提高二倍。不知您作何感受,如果我能將某件事情無(wú)限并行化,但速度卻只能提升二倍,這種微不足道的提升一定會(huì )讓我感到非常惱火!在設計 Helium 時(shí),我們必須考慮矢量指令及其相關(guān)聯(lián)的一切內容,這樣才能最大限度地提高性能。

串行代碼在循環(huán)處理中很常見(jiàn),串行代碼造成的開(kāi)銷(xiāo)可能相當大,特別是對于小循環(huán)。下面的內存復制代碼就是一個(gè)很好的例子:

循環(huán)迭代計數的遞減和返回循環(huán)頂端的條件分支占循環(huán)指令的 50%。許多小型 Cortex-M 處理器沒(méi)有分支預測器(小型 Cortex-M 處理器的面積效率極高,這意味著(zhù)許多分支預測器比整個(gè) Cortex-M 處理器還要大幾倍)。因此,由于分支損失,運行時(shí)開(kāi)銷(xiāo)實(shí)際上高于 50%。通過(guò)在多次迭代中攤銷(xiāo)開(kāi)銷(xiāo),循環(huán)展開(kāi)可以幫助減少開(kāi)銷(xiāo),但會(huì )增加代碼大小,并使代碼的矢量化過(guò)程更加復雜。鑒于許多 DSP 內核都有小循環(huán),因此在 Helium 研究項目中解決這些問(wèn)題至關(guān)重要。 許多專(zhuān)用 DSP 處理器支持零開(kāi)銷(xiāo)循環(huán)。一種實(shí)現方法是使用 REPEAT 指令,告訴處理器將下面的指令重復 N 次:

處理器必須記錄多項數據:

循環(huán)開(kāi)始的地址

需要分支回到循環(huán)開(kāi)始前所剩余的指令數

剩余的循環(huán)迭代次數

在處理中斷時(shí),跟蹤記錄所有這些數據可能會(huì )造成問(wèn)題,因此一些 DSP 只需要延遲中斷,直到循環(huán)完成。如果要執行大量的迭代,這可能需要相當長(cháng)的時(shí)間,而且完全不符合 Cortex-M 處理器應該實(shí)現的快速和確定性中斷延遲的需求。這種方法也不適用于處理精確故障,如權限違規導致的內存管理故障異常 (MemManage)。另一種方法是增加額外的寄存器來(lái)處理循環(huán)狀態(tài)。但這些新寄存器必須在異常進(jìn)入和返回時(shí)保存和恢復,而這又會(huì )增加中斷延遲。為了解決這個(gè)問(wèn)題,Armv8.1-M 采用了一對循環(huán)指令:

該循環(huán)首先執行 While Loop Start (WLS) 指令,該指令將循環(huán)迭代計數復制到 LR,循環(huán)迭代計數為零時(shí),分支到循環(huán)結束。還有一條 Do Loop Start (DLS) 指令,可用于設置一個(gè)循環(huán),在該循環(huán)中至少始終執行一次迭代。Loop End (LE) 指令檢查 LR 以確認是否還需要一次迭代,如果需要,則分支返回起點(diǎn)。有趣的是, 處理器可以緩存 LE 指令提供的信息(即循環(huán)開(kāi)始和結束的位置),因此在下一次迭代時(shí),處理器甚至可以在獲取 LE 指令之前分支回到循環(huán)的起點(diǎn)。 因此,處理器執行的指令序列如下所示:

在循環(huán)末尾添加循環(huán)指令有一個(gè)很好的副作用, 如果緩存的循環(huán)信息刷新,該指令將重新執行。然后,重新執行 LE 指令將重新填充緩存。 如下圖所示,由于無(wú)需保存循環(huán)開(kāi)始和結束地址,因此現有的快速中斷處理功能得以保留。

除了第一次迭代和從中斷恢復時(shí)的一些設置外,所有時(shí)間實(shí)際上都花在了內存復制而不是循環(huán)處理上。此外, 由于處理器事先知道指令的順序,因此總能用正確的指令填充流水線(xiàn)。這樣就消除了流水線(xiàn)清空和由此導致的分支損失。 因此,我們可以將這一循環(huán)矢量化,不必再擔心 Amdahl 定律的影響,我們(暫時(shí))克服了這些困難。

在對代碼進(jìn)行矢量化時(shí),一個(gè)循環(huán)通常以不同類(lèi)型的指令開(kāi)始和結束,例如矢量加載 (VLDR) 和矢量乘加 (VMLA)。執行這樣的循環(huán)時(shí),會(huì )產(chǎn)生一長(cháng)串不間斷的交替 VLDR/VMLA 操作(如下圖所示)。 這種不間斷的鏈條使處理器能夠從指令重疊中獲得最大益處,因為它甚至可以從一個(gè)循環(huán)迭代結束重疊到下一個(gè)迭代開(kāi)始,從而進(jìn)一步提高性能。 關(guān)于指令重疊的更多信息,可參閱: 《Arm Helium 技術(shù)誕生的由來(lái):為何不直接采用 Neon?》

當需要處理的數據量不是矢量長(cháng)度的倍數時(shí),矢量化代碼就會(huì )出現問(wèn)題。典型的解決方案是先處理全矢量,然后用一個(gè)串行/非矢量化尾部清理循環(huán)來(lái)處理剩余的元素。不知不覺(jué)中,Amdahl 定律又出現了,真是令人不勝其煩!Helium 中的矢量可容納 16 個(gè) 8 位數值,因此在我們對 31 字節的 memcpy 函數進(jìn)行矢量化時(shí),僅有不到一半的拷貝將由尾部循環(huán)連續執行,而不是由矢量指令并行執行。為了解決這個(gè)問(wèn)題,我們增加了循環(huán)指令的尾部預測變體(如 WLSTP、LETP)。對于這些尾部預測循環(huán),LR 保存的是要處理的矢量元素的個(gè)數,而不是要執行的循環(huán)迭代的次數。循環(huán)開(kāi)始指令 (WLSTP) 有一個(gè)大小字段(下面 memcpy 函數示例中的“.8”),用于指定要處理的元素的寬度。

如果您曾見(jiàn)過(guò)其他優(yōu)化的 memcpy 例程,可能會(huì )對這個(gè)例子的簡(jiǎn)單程度感到驚訝,但對于 Helium 來(lái)說(shuō),這已經(jīng)是最好的完全矢量化解決方案所需要的一切了。具體工作原理如下: 處理器使用大小字段和剩余元素的數量來(lái)計算剩余迭代次數。如果最后一次迭代要處理的元素個(gè)數少于矢量長(cháng)度,則矢量末尾相應數量的元素將被禁用。因此,在上文復制 31 個(gè)字節的例子中,Helium 會(huì )在第一次迭代時(shí)并行復制 16 個(gè)字節,然后在下一次迭代時(shí)并行復制 15 個(gè)字節。 這不僅可以避免 Amdahl 定律的影響,實(shí)現該有的性能,還可以完全消除串行尾碼,減少代碼量,簡(jiǎn)化開(kāi)發(fā)過(guò)程。

由于面臨高性能目標和嚴格的面積/中斷延遲限制,我們在設計 Helium 時(shí)就像在設計一個(gè)多維拼圖,且其中一半的形狀是已經(jīng)固定的。架構中看似毫不相干的部分可以相互作用,產(chǎn)生意想不到的效果或助力解決一些有趣的難題。

整個(gè) Helium 研究團隊和我都無(wú)比期待看到 Helium 技術(shù)能夠為全新的應用帶來(lái)有力的支持。 目前 Cortex-M 已有三款產(chǎn)品支持 Helium 技術(shù)——Cortex-M52、Cortex-M55 和 Cortex-M85 ,我迫不及待看到 Helium 技術(shù)持續賦能我們生態(tài)伙伴的 AI 創(chuàng )新應用。



關(guān)鍵詞: Arm Amdahl Helium

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>