版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
NEON指令優(yōu)化線性加載RGB數據首先看一個實例,24-bit的RGB圖像,像素在內存里的組織方式是R,G,B,R,G,B...,如果你想做一個簡單的圖像處理,比如把R和B通道互換,你該如何高效的使用NEON協(xié)處理器呢?首先從存儲空間線性加載RGB數據到D寄存器,然后交換R和B數據。但是這種線性加載的數據進行R和B通道的數據交換非常麻煩,需要首先掩碼mask,然后移位并合并掩碼數據。這種復雜的運算顯然并不高效。結構化的加載指令加載RGB數據NEON提供了各種結構的加載和存儲指令來處理這種情況,這些指令能把數據從存儲區(qū)加載的同時還能把這些值分開存儲到不同的寄存器中,如下圖2所示,你可以使用VLD3加載來把RGB數據分開存儲。交換指令VSWP使用VLD3分開加載的數據就能方便的使用指令(VSWPd0,d2)來進行R和B通道的交換了,然后把結果再寫入內存,當然也要使用interleave交織模式的存儲,即VST3存儲指令。結構化加載和存儲語法和具體指令NEON結構化加載會讀取內存內容到64-bit的NEON寄存器,使用可選的deinterleave選項,同樣加載指令也可以采用這種reinterleave的方式把寄存器的內容寫到內存空間。結構化加載和存儲語法和具體指令加載VLD或者存儲VST指令助記符:instructionmnemonic
一個表示interleave模式的數字,表示每個結構體元素間的間隔:interleavepattern
表示每次訪問單元的位寬比特數,即結構體內元素類型:elementtype
讀寫的64-bit的NEON寄存器集合,最多可以列出4個寄存器,取決于interleave模式:NEONregisters
表示內存訪問地址的ARM寄存器,該地址可以在每次訪問時更新:ARMaddressregister
結構化加載和存儲語法和具體指令交織模式:InterleavePattern加載和存儲指令可以用從1到4個相同大小的元素的交織結構體,這些元素可以是NEON指令通常支持的8,16或者32比特。VLD1是最簡單的形式,從內存加載1~4個寄存器的數據,沒有deinterleave,即線性加載;VLD2加載2或者4個寄存器的數據,解交織奇偶元素到各自的寄存器,這樣很容易的把交織的立體聲音頻數據分解為左右聲道的數據;VLD3加載3個寄存器的數據,很方便的把RGB的數據分為R、G、B通道;VLD4加載4個寄存器的數據,解交織,用于分解ARGB圖像數據;存儲和加載類似,只是把寄存器的數據interleave然后寫到內存。結構化加載和存儲語法和具體指令元素類型ElementTypes加載和存儲interleave的數據的基本元素可以為8,16或者32比特的數據。比如NEON指令VLD2.16將加載4個16-bit元素到第一個寄存器,然后4個16-bit元素到第二個寄存器,把臨近的奇偶對分開保存到每個寄存器。結構化加載和存儲語法和具體指令把元素大小變成32-bits還是加載相同大小的數據,但是只有2個元素來構成一個向量,同樣分成奇偶元素部分。元素大小還會影響大小端的處理。如果你指定了正確的加載和存儲指令的元素大小,從存儲空間讀取和存儲的字節(jié)都會按照正確的次序排列,因而相同的代碼會在大端和小端系統(tǒng)里適用。最后元素大小還會影響指針的數據對齊,把數據對齊到元素大小的邊界能帶來更好的性能,當然這也是一般的操作系統(tǒng)OS要求的。如,加載32位元素數據,通常要把第一個元素的地址對齊到32位邊界。單個或者多個元素SingleorMultipleElements除了加載多個元素,結構讀取還能從內存用deinterleave的模式讀取一個元素到NEON寄存器的多個通道或者一個通道而保存其他通道不變。單個或者多個元素SingleorMultipleElements加載到單一通道對于從分散的內存空間的數據讀取來構建一個向量非常有用。存儲數據到內存也是一樣,也可以采用通道的模式進行存儲。尋址模式AddressingNEON的加載和存儲指令支持3種格式的尋址模式:寄存器[{,:}]:數據將會從指定寄存器的地址加載或者存儲;帶自動加減地址更新的寄存器[{,:}]!:在數據從指定寄存器的地址加載或者存儲后會更新地址,更新的地址大小等于讀取或者存儲的數據元素大小;帶后索引的寄存器[{,:}],:存儲空間訪問后,會根據制定的寄存器Rm來更新地址,當需要讀取或者存儲一組具有固定間隔的數據時非常有用。其他的加載和存儲NEON還支持以下的數據加載和存儲:VLDR和VSTR來加載和存儲64-bit數值到一個單一的寄存器;VLDM和VSTM來從堆棧加載或者存儲多個64-bit數值;移位向量NEON中的移位指令和ARM指令中的標量移位,把向量中的各個元素左移或者右移若干比特。那些移到臨近元素的比特會被丟棄掉,不會影響到鄰近元素的移位結果。移位操作的移位數可以直接編碼到指令里,或者用一個指定的移位比特向量,如果使用移位向量,每一個元素的移位比特值將取決于對應的移位向量里存儲的值,移位向量里保存的移位值是有符號的,所以可能進行左移,右移或者不移位的操作。有符號數據的右移操作的類型可以根據指令來制定,如是否進行符號擴展(算術右移還是邏輯右移),這對應于ARM指令里的移位操作。對于無符號的右移而言,就不用進行符號擴展了。
移位并右側插入NEON還支持帶插入的移位,即進行兩個向量的比特位域的組合。比如VLSI指令左移并插入,會把向量進行左移,然后用目標向量的右側數據來填充。如下圖所示:移位移位并累加NEON支持把向量的各個元素右移然后累加結果到另外一個向量。這對于那些中間結果需要更高精度的情況非常適用,然后才把結果保存到一個低精度的累加器里。指令修改符每個移位指令都能包含一個或者多個修改符,這些修改符不會改變移位操作本身,但是輸入和輸出結果會去除基準或者飽和到一個有效范圍,有5種移位限定符:舍入(round),使用R前綴,用于糾正右移截斷導致的基準;變窄(narrow),使用N前綴,表示向量中所有元素的位寬變窄為一半,即源是128-bit的Q寄存器,而結果是64-bit的D寄存器;變長(long),使用L前綴,表示向量中所有元素的位寬變寬為兩倍,即源是64-bit的D寄存器,而結果是128-bit的Q寄存器;飽和(saturate),使用Q前綴,把結果元素變成其能表示的最大和最小值范圍內,位寬比特數和符號類型來表明該元素的有效范圍;無符號的飽和(UnsignedSaturating),使用Q前綴,U后綴,類似于飽和限定符,但結果會飽和到無符號數據范圍,不管輸入是有符號還是無符號的;這些限定符的有些組合起來不能描述有用的操作,因而NEON并不包含這些指令。比如類似VQSHR的飽和右移并不需要,因為右移會讓數據變小,不會超過有效范圍。有效的移位操作色深轉換的例子色深轉換是圖像處理中經常用到的。通常輸入數據是RGB56516-bit色度格式,需要轉換成RGB888格式才更適合于NEON這種并行處理。然而NEON還是能處理RGB565的數據的,這就需要用到前面提到的移位指令了。從RGB565到RGB888首先看如何從RGB565轉換成RGB888,假設輸入的8個16-bit的像素保存到寄存器Q0,我們想把分量分離成R通道,G通道和B通道,保存到d2到d4寄存器。vshr.u8q1,q0,#3
@把R通道右移3比特,丟棄G通道比特vshrn.i16d2,q1,#5
@右移并變窄,取得R分量數據到d2寄存器vshrn.i16d3,q0,#5
@右移并變窄取得G分量數據vshl.i8d3,d3,#2
@左移G分量2個比特,丟棄R分量部分,同時把G分量保存到正確的位置;vshl.i16
q0,q0,#3
@把B分量左移到最重要的8-bit數據vmovn.i16d4,q0
@丟地仍然有的R和G分量,保存B分量為8-bit你可能注意到,這樣轉換成RGB888格式后,原來的白就不是完全的白色了,這是因為R和B分量是左移3bit,而G分量則只左移兩bit,因而如RGB565值(0x1F,0x3F,0x1F)變成RGB888(0xF8,0xFC,0xF8),并不跟以前的表示顏色一致。從RGB888到RGB565從RGB888轉換成RGB565,假設RGB888的輸入是用上面代碼表示的形式,單獨通道的分量保存在從寄存器d0到d2,結果保存到16-bit的RGB565格式到q2寄存器。
vshll.u8
q2,d0,#8
@左移紅色分量到16bit結果中的最重要的5bitvshll.u8
q3,d1,#8
@左移綠色分量數據到16bit最重要的8比特
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美團外賣店鋪服務標準合同范本4篇
- 二零二五年度標準裝載機租賃合同附帶租賃設備更換服務3篇
- 2025年度美團外賣平臺食品安全責任承諾合同2篇
- 2025年度房地產開發(fā)項目融資合同范本7篇
- 二零二五年度船舶貨物保險合同示范文本2篇
- 二零二五年度新能源產業(yè)融資合同3篇
- 二零二五年度全新廣東房屋租賃合同規(guī)范租賃市場秩序2篇
- 2025年度科技創(chuàng)新區(qū)土地使用權轉讓居間合同范本
- 2025年度農藥產品代理銷售數據統(tǒng)計分析合同
- 2025年度南京汽車租賃押金管理合同范本4篇
- 2024年財政部會計法律法規(guī)答題活動題目及答案一
- 2024年云網安全應知應會考試題庫
- 寒假計劃表作息時間安排表
- 高考日語基礎歸納總結與練習(一輪復習)
- 《預防犯罪》課件
- 【企業(yè)作業(yè)成本在上海汽車集團中的應用研究案例7300字(論文)】
- 高中物理答題卡模板
- 化學用語專項訓練
- 芳香植物與芳香療法講解課件
- 不孕癥診斷、治療新進展課件
- 學校食堂食品質量控制方案
評論
0/150
提交評論