對於ARM和NEON編程來說,我相當新,我已經給了一個優化SAD(絕對差值和)函數的任務。我不知道從哪裏開始,我嘗試了幾種不成功的方法來生成NEON代碼。 順序功能看起來是這樣的:ARM NEON 8x8 SAD操作
void sad_block_8x8(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
int u, v;
*result = 0;
for (v = 0; v < 8; ++v)
{
for (u = 0; u < 8; ++u)
{
*result += abs(block2[v*stride+u] - block1[v*stride+u]);
}
}
}
所以我的問題是:
- 如何加載寄存器每次迭代
- 我怎麼做計算,並將其存儲到變量結果
任何幫助將非常感謝!
好......所以我的第一次嘗試是這樣的(它的工作原理,但我知道是一個非常壞霓虹燈代碼)
void sad_block_8x8_2(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
int u, v;
uint8x8_t m_1, m_2, m_o;
uint8_t* test;
test = (uint8_t*)malloc(v*u*sizeof(uint8_t));;
*result = 0;
for (v = 0; v < 8; ++v)
{
for(u = 0; u < 8; ++u)
{
m_1 = vld1_u8(&block1[v*stride]);
m_2 = vld1_u8(&block2[v*stride]);
m_o = vabd_u8(m_2, m_1);
vst1_u8(&test[v], m_o);
//printf("%d ", test[v]);
*result += (int)test[v];
}
}
}
任何幫助嗎?
輸入數據塊應該是'const'。您是否嘗試過支持NEON的編譯器,它可能會自動爲您編譯? – unwind
要獲得8x8到8x1雙向您可以用'uint16x8_t vabal_u8(uint16x8_t,uint8x8_t,uint8x8_t)'在arm_neon.h – user3528438