<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM處理器NEON編程及優(yōu)化技巧——數(shù)據(jù)加載和存儲(chǔ)

          ARM處理器NEON編程及優(yōu)化技巧——數(shù)據(jù)加載和存儲(chǔ)

          作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          ARM的NEON協(xié)處理器技術(shù)是一個(gè)64/128-bit的混合SIMD架構(gòu),用于加速包括視頻編碼解碼、音頻解碼編碼、3D圖像、語音和圖像等多媒體和信號(hào)處理應(yīng)用。本文主要介紹如何使用NEON的匯編程序來寫SIMD的代碼,包括如何開始NEON的開發(fā),如何高效的利用NEON。首先會(huì)關(guān)注內(nèi)存操作,即如何變更指令來靈活有效的加載和存儲(chǔ)數(shù)據(jù)。接下來是由于SIMD指令的應(yīng)用而導(dǎo)致剩下的若干個(gè)單元的處理,最后是一個(gè)例子來說明用NEON來進(jìn)行SIMD優(yōu)化。

          SIMD的例子

          本文引用地址:http://www.ex-cimer.com/article/201611/317427.htm

          首先看一個(gè)實(shí)例,24-bit的RGB圖像,像素在內(nèi)存里的組織方式是R, G, B, R, G, B...,如果你想做一個(gè)簡(jiǎn)單的圖像處理,比如把R和B通道互換,你該如何高效的使用NEON協(xié)處理器呢?首先從存儲(chǔ)空間線性加載RGB數(shù)據(jù)到D寄存器,然后交換R和B數(shù)據(jù)。 但是這種線性加載的數(shù)據(jù)進(jìn)行R和B通道的數(shù)據(jù)交換非常麻煩,需要首先掩碼mask,然后移位并合并掩碼數(shù)據(jù)。這種復(fù)雜的運(yùn)算顯然并不高效。

          圖1. 線性加載RGB數(shù)據(jù)

          NEON提供了各種結(jié)構(gòu)的加載和存儲(chǔ)指令來處理這種情況,這些指令能把數(shù)據(jù)從存儲(chǔ)區(qū)加載的同時(shí)還能把這些值分開存儲(chǔ)到不同的寄存器中,如下圖2所示,你可以使用VLD3加載來把RGB數(shù)據(jù)分開存儲(chǔ)。

          圖2. 使用結(jié)構(gòu)化的加載指令加載RGB數(shù)據(jù)

          然后使用VLD3分開加載的數(shù)據(jù)就能方便的使用指令(VSWP d0, d2)來進(jìn)行R和B通道的交換了,然后把結(jié)果再寫入內(nèi)存,當(dāng)然也要使用interleave交織模式的存儲(chǔ),即VST3存儲(chǔ)指令。

          圖3. 交換寄存器d0和d2然后存儲(chǔ)

          結(jié)構(gòu)化加載和存儲(chǔ)語法和具體指令

          NEON結(jié)構(gòu)化加載會(huì)讀取內(nèi)存內(nèi)容到64-bit的NEON寄存器,使用可選的deinterleave選項(xiàng),同樣加載指令也可以采用這種reinterleave的方式把寄存器的內(nèi)容寫到內(nèi)存空間。

          圖4. NEON的結(jié)構(gòu)化加載和存儲(chǔ)

          下面介紹NEON存儲(chǔ)和加載的結(jié)構(gòu)化方式,語法包括如下5個(gè)部分:

          圖5. NEON的結(jié)構(gòu)化加載和存儲(chǔ)語法

          • 加載VLD或者存儲(chǔ)VST指令助記符:instruction mnemonic
          • 一個(gè)表示interleave模式的數(shù)字,表示每個(gè)結(jié)構(gòu)體元素間的間隔:interleave pattern
          • 表示每次訪問單元的位寬比特?cái)?shù),即結(jié)構(gòu)體內(nèi)元素類型:element type
          • 讀寫的64-bit的NEON寄存器集合,最多可以列出4個(gè)寄存器,取決于interleave模式:NEON registers
          • 表示內(nèi)存訪問地址的ARM寄存器,該地址可以在每次訪問時(shí)更新: ARMaddress register

          交織模式:Interleave Pattern

          加載和存儲(chǔ)指令可以用從1到4個(gè)相同大小的元素的交織結(jié)構(gòu)體,這些元素可以是NEON指令通常支持的8,16或者32比特。

          • VLD1是最簡(jiǎn)單的形式,從內(nèi)存加載1~4個(gè)寄存器的數(shù)據(jù),沒有deinterleave,即線性加載;
          • VLD2加載2或者4個(gè)寄存器的數(shù)據(jù),解交織奇偶元素到各自的寄存器,這樣很容易的把交織的立體聲音頻數(shù)據(jù)分解為左右聲道的數(shù)據(jù);
          • VLD3加載3個(gè)寄存器的數(shù)據(jù),很方便的把RGB的數(shù)據(jù)分為R、G、B通道;
          • VLD4加載4個(gè)寄存器的數(shù)據(jù),解交織,用于分解ARGB圖像數(shù)據(jù);

          存儲(chǔ)和加載類似,只是把寄存器的數(shù)據(jù)interleave然后寫到內(nèi)存。

          元素類型Element Types

          加載和存儲(chǔ)interleave的數(shù)據(jù)的基本元素可以為8,16或者32比特的數(shù)據(jù)。比如NEON指令VLD2.16將加載4個(gè)16-bit元素到第一個(gè)寄存器,然后4個(gè)16-bit元素到第二個(gè)寄存器,把臨近的奇偶對(duì)分開保存到每個(gè)寄存器。

          圖6. 加載并解交織16-bit的數(shù)據(jù)

          把元素大小變成32-bits還是加載相同大小的數(shù)據(jù),但是只有2個(gè)元素來構(gòu)成一個(gè)向量,同樣分成奇偶元素部分。

          圖6. 加載并解交織32-bit的數(shù)據(jù)

          元素大小還會(huì)影響大小端的處理。如果你指定了正確的加載和存儲(chǔ)指令的元素大小,從存儲(chǔ)空間讀取和存儲(chǔ)的字節(jié)都會(huì)按照正確的次序排列,因而相同的代碼會(huì)在大端和小端系統(tǒng)里適用。最后元素大小還會(huì)影響指針的數(shù)據(jù)對(duì)齊,把數(shù)據(jù)對(duì)齊到元素大小的邊界能帶來更好的性能,當(dāng)然這也是一般的操作系統(tǒng)OS要求的。如,加載32位元素?cái)?shù)據(jù),通常要把第一個(gè)元素的地址對(duì)齊到32位邊界。

          單個(gè)或者多個(gè)元素 Single or Multiple Elements

          除了加載多個(gè)元素,結(jié)構(gòu)讀取還能從內(nèi)存用deinterleave的模式讀取一個(gè)元素到NEON寄存器的多個(gè)通道或者一個(gè)通道而保存其他通道不變。

          圖7. 加載并解交織到所有的通道

          加載到單一通道對(duì)于從分散的內(nèi)存空間的數(shù)據(jù)讀取來構(gòu)建一個(gè)向量非常有用。存儲(chǔ)數(shù)據(jù)到內(nèi)存也是一樣,也可以采用通道的模式進(jìn)行存儲(chǔ)。

          圖7. 加載并解交織到單一的通道

          尋址模式Addressing

          NEON的加載和存儲(chǔ)指令支持3種格式的尋址模式:

          • 寄存器 [ {,:}]:數(shù)據(jù)將會(huì)從指定寄存器的地址加載或者存儲(chǔ);
          • 帶自動(dòng)加減地址更新的寄存器[{,:}]!:在數(shù)據(jù)從指定寄存器的地址加載或者存儲(chǔ)后會(huì)更新地址,更新的地址大小等于讀取或者存儲(chǔ)的數(shù)據(jù)元素大??;
          • 帶后索引的寄存器[{,:}],:存儲(chǔ)空間訪問后,會(huì)根據(jù)制定的寄存器Rm來更新地址,當(dāng)需要讀取或者存儲(chǔ)一組具有固定間隔的數(shù)據(jù)時(shí)非常有用。

          其他的加載和存儲(chǔ)

          NEON還支持以下的數(shù)據(jù)加載和存儲(chǔ):

          • VLDR和VSTR來加載和存儲(chǔ)64-bit數(shù)值到一個(gè)單一的寄存器;
          • VLDM和VSTM來從堆棧加載或者存儲(chǔ)多個(gè)64-bit數(shù)值;

          更多的關(guān)于支持的加載和存儲(chǔ)運(yùn)算可以參考ARM的參考手冊(cè)arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406b/index.html" rel="nofollow">ARM Architecture Reference Manual. 詳細(xì)的指令周期信息可以參考每個(gè)單獨(dú)的指令Technical Reference Manual for each core.



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();