NEON指令優(yōu)化課件_第1頁
NEON指令優(yōu)化課件_第2頁
NEON指令優(yōu)化課件_第3頁
NEON指令優(yōu)化課件_第4頁
NEON指令優(yōu)化課件_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

NEON指令優(yōu)化線性加載RGB數(shù)據(jù)首先看一個實例,24-bit的RGB圖像,像素在內(nèi)存里的組織方式是R,G,B,R,G,B...,如果你想做一個簡單的圖像處理,比如把R和B通道互換,你該如何高效的使用NEON協(xié)處理器呢?首先從存儲空間線性加載RGB數(shù)據(jù)到D寄存器,然后交換R和B數(shù)據(jù)。但是這種線性加載的數(shù)據(jù)進行R和B通道的數(shù)據(jù)交換非常麻煩,需要首先掩碼mask,然后移位并合并掩碼數(shù)據(jù)。這種復雜的運算顯然并不高效。結(jié)構(gòu)化的加載指令加載RGB數(shù)據(jù)NEON提供了各種結(jié)構(gòu)的加載和存儲指令來處理這種情況,這些指令能把數(shù)據(jù)從存儲區(qū)加載的同時還能把這些值分開存儲到不同的寄存器中,如下圖2所示,你可以使用VLD3加載來把RGB數(shù)據(jù)分開存儲。交換指令VSWP使用VLD3分開加載的數(shù)據(jù)就能方便的使用指令(VSWPd0,d2)來進行R和B通道的交換了,然后把結(jié)果再寫入內(nèi)存,當然也要使用interleave交織模式的存儲,即VST3存儲指令。結(jié)構(gòu)化加載和存儲語法和具體指令NEON結(jié)構(gòu)化加載會讀取內(nèi)存內(nèi)容到64-bit的NEON寄存器,使用可選的deinterleave選項,同樣加載指令也可以采用這種reinterleave的方式把寄存器的內(nèi)容寫到內(nèi)存空間。結(jié)構(gòu)化加載和存儲語法和具體指令加載VLD或者存儲VST指令助記符:instructionmnemonic

一個表示interleave模式的數(shù)字,表示每個結(jié)構(gòu)體元素間的間隔:interleavepattern

表示每次訪問單元的位寬比特數(shù),即結(jié)構(gòu)體內(nèi)元素類型:elementtype

讀寫的64-bit的NEON寄存器集合,最多可以列出4個寄存器,取決于interleave模式:NEONregisters

表示內(nèi)存訪問地址的ARM寄存器,該地址可以在每次訪問時更新:ARMaddressregister

結(jié)構(gòu)化加載和存儲語法和具體指令交織模式:InterleavePattern加載和存儲指令可以用從1到4個相同大小的元素的交織結(jié)構(gòu)體,這些元素可以是NEON指令通常支持的8,16或者32比特。VLD1是最簡單的形式,從內(nèi)存加載1~4個寄存器的數(shù)據(jù),沒有deinterleave,即線性加載;VLD2加載2或者4個寄存器的數(shù)據(jù),解交織奇偶元素到各自的寄存器,這樣很容易的把交織的立體聲音頻數(shù)據(jù)分解為左右聲道的數(shù)據(jù);VLD3加載3個寄存器的數(shù)據(jù),很方便的把RGB的數(shù)據(jù)分為R、G、B通道;VLD4加載4個寄存器的數(shù)據(jù),解交織,用于分解ARGB圖像數(shù)據(jù);存儲和加載類似,只是把寄存器的數(shù)據(jù)interleave然后寫到內(nèi)存。結(jié)構(gòu)化加載和存儲語法和具體指令元素類型ElementTypes加載和存儲interleave的數(shù)據(jù)的基本元素可以為8,16或者32比特的數(shù)據(jù)。比如NEON指令VLD2.16將加載4個16-bit元素到第一個寄存器,然后4個16-bit元素到第二個寄存器,把臨近的奇偶對分開保存到每個寄存器。結(jié)構(gòu)化加載和存儲語法和具體指令把元素大小變成32-bits還是加載相同大小的數(shù)據(jù),但是只有2個元素來構(gòu)成一個向量,同樣分成奇偶元素部分。元素大小還會影響大小端的處理。如果你指定了正確的加載和存儲指令的元素大小,從存儲空間讀取和存儲的字節(jié)都會按照正確的次序排列,因而相同的代碼會在大端和小端系統(tǒng)里適用。最后元素大小還會影響指針的數(shù)據(jù)對齊,把數(shù)據(jù)對齊到元素大小的邊界能帶來更好的性能,當然這也是一般的操作系統(tǒng)OS要求的。如,加載32位元素數(shù)據(jù),通常要把第一個元素的地址對齊到32位邊界。單個或者多個元素SingleorMultipleElements除了加載多個元素,結(jié)構(gòu)讀取還能從內(nèi)存用deinterleave的模式讀取一個元素到NEON寄存器的多個通道或者一個通道而保存其他通道不變。單個或者多個元素SingleorMultipleElements加載到單一通道對于從分散的內(nèi)存空間的數(shù)據(jù)讀取來構(gòu)建一個向量非常有用。存儲數(shù)據(jù)到內(nèi)存也是一樣,也可以采用通道的模式進行存儲。尋址模式AddressingNEON的加載和存儲指令支持3種格式的尋址模式:寄存器[{,:}]:數(shù)據(jù)將會從指定寄存器的地址加載或者存儲;帶自動加減地址更新的寄存器[{,:}]!:在數(shù)據(jù)從指定寄存器的地址加載或者存儲后會更新地址,更新的地址大小等于讀取或者存儲的數(shù)據(jù)元素大??;帶后索引的寄存器[{,:}],:存儲空間訪問后,會根據(jù)制定的寄存器Rm來更新地址,當需要讀取或者存儲一組具有固定間隔的數(shù)據(jù)時非常有用。其他的加載和存儲NEON還支持以下的數(shù)據(jù)加載和存儲:VLDR和VSTR來加載和存儲64-bit數(shù)值到一個單一的寄存器;VLDM和VSTM來從堆棧加載或者存儲多個64-bit數(shù)值;移位向量NEON中的移位指令和ARM指令中的標量移位,把向量中的各個元素左移或者右移若干比特。那些移到臨近元素的比特會被丟棄掉,不會影響到鄰近元素的移位結(jié)果。移位操作的移位數(shù)可以直接編碼到指令里,或者用一個指定的移位比特向量,如果使用移位向量,每一個元素的移位比特值將取決于對應的移位向量里存儲的值,移位向量里保存的移位值是有符號的,所以可能進行左移,右移或者不移位的操作。有符號數(shù)據(jù)的右移操作的類型可以根據(jù)指令來制定,如是否進行符號擴展(算術(shù)右移還是邏輯右移),這對應于ARM指令里的移位操作。對于無符號的右移而言,就不用進行符號擴展了。

移位并右側(cè)插入NEON還支持帶插入的移位,即進行兩個向量的比特位域的組合。比如VLSI指令左移并插入,會把向量進行左移,然后用目標向量的右側(cè)數(shù)據(jù)來填充。如下圖所示:移位移位并累加NEON支持把向量的各個元素右移然后累加結(jié)果到另外一個向量。這對于那些中間結(jié)果需要更高精度的情況非常適用,然后才把結(jié)果保存到一個低精度的累加器里。指令修改符每個移位指令都能包含一個或者多個修改符,這些修改符不會改變移位操作本身,但是輸入和輸出結(jié)果會去除基準或者飽和到一個有效范圍,有5種移位限定符:舍入(round),使用R前綴,用于糾正右移截斷導致的基準;變窄(narrow),使用N前綴,表示向量中所有元素的位寬變窄為一半,即源是128-bit的Q寄存器,而結(jié)果是64-bit的D寄存器;變長(long),使用L前綴,表示向量中所有元素的位寬變寬為兩倍,即源是64-bit的D寄存器,而結(jié)果是128-bit的Q寄存器;飽和(saturate),使用Q前綴,把結(jié)果元素變成其能表示的最大和最小值范圍內(nèi),位寬比特數(shù)和符號類型來表明該元素的有效范圍;無符號的飽和(UnsignedSaturating),使用Q前綴,U后綴,類似于飽和限定符,但結(jié)果會飽和到無符號數(shù)據(jù)范圍,不管輸入是有符號還是無符號的;這些限定符的有些組合起來不能描述有用的操作,因而NEON并不包含這些指令。比如類似VQSHR的飽和右移并不需要,因為右移會讓數(shù)據(jù)變小,不會超過有效范圍。有效的移位操作色深轉(zhuǎn)換的例子色深轉(zhuǎn)換是圖像處理中經(jīng)常用到的。通常輸入數(shù)據(jù)是RGB56516-bit色度格式,需要轉(zhuǎn)換成RGB888格式才更適合于NEON這種并行處理。然而NEON還是能處理RGB565的數(shù)據(jù)的,這就需要用到前面提到的移位指令了。從RGB565到RGB888首先看如何從RGB565轉(zhuǎn)換成RGB888,假設(shè)輸入的8個16-bit的像素保存到寄存器Q0,我們想把分量分離成R通道,G通道和B通道,保存到d2到d4寄存器。vshr.u8q1,q0,#3

@把R通道右移3比特,丟棄G通道比特vshrn.i16d2,q1,#5

@右移并變窄,取得R分量數(shù)據(jù)到d2寄存器vshrn.i16d3,q0,#5

@右移并變窄取得G分量數(shù)據(jù)vshl.i8d3,d3,#2

@左移G分量2個比特,丟棄R分量部分,同時把G分量保存到正確的位置;vshl.i16

q0,q0,#3

@把B分量左移到最重要的8-bit數(shù)據(jù)vmovn.i16d4,q0

@丟地仍然有的R和G分量,保存B分量為8-bit你可能注意到,這樣轉(zhuǎn)換成RGB888格式后,原來的白就不是完全的白色了,這是因為R和B分量是左移3bit,而G分量則只左移兩bit,因而如RGB565值(0x1F,0x3F,0x1F)變成RGB888(0xF8,0xFC,0xF8),并不跟以前的表示顏色一致。從RGB888到RGB565從RGB888轉(zhuǎn)換成RGB565,假設(shè)RGB888的輸入是用上面代碼表示的形式,單獨通道的分量保存在從寄存器d0到d2,結(jié)果保存到16-bit的RGB565格式到q2寄存器。

vshll.u8

q2,d0,#8

@左移紅色分量到16bit結(jié)果中的最重要的5bitvshll.u8

q3,d1,#8

@左移綠色分量數(shù)據(jù)到16bit最重要的8比特

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論