2013-03-18 72 views
0

我想通過使用Neon intrinsics作爲練習來減去兩個圖像(灰度),我不知道用C intrinsics減去兩個向量的最佳方法是什麼。使用NEON減去兩個圖像

void subtractTwoImagesNeonOnePass(uint8_t *src, uint8_t*dest, uint8_t*result, int srcWidth) 
{ 


    for (int i = 0; i<srcWidth; i++) 
    { 
     // load 8 pixels 
     uint8x8x3_t srcPixels = vld3_u8 (src); 
     uint8x8x3_t dstPixels = vld3_u8 (src); 
     // subtract them 
     uint8x8x3_t subPixels = vsub_u8(srcPixels, dstPixels); 
     // store the result 
     vst1_u8 (result, subPixels); 
     // move 8 pixels 
     src+=8; 
     dest+=8; 
     result+=8; 

    } 

} 
+0

編譯後使用'objdump'並檢查生成的二進制文件的程序集。如果它看起來夠好,那就夠好了。 – auselen 2013-03-18 17:04:04

+0

@auselen它不編譯,uint8x8x3_t subPixels = vsub_u8(srcPixels,dstPixels); – 2013-03-18 17:12:13

+2

如果這些只是灰度圖像,那麼您不想使用3種組件類型和內在函數 - 使用'uint8x16_t'作爲數據類型,然後使用普通的16字節加載和存儲。 – 2013-03-18 17:19:11

回答

2

看起來您正在使用錯誤類型的加載和存儲。你從三個頻道的例子中複製了這個嗎?我想這是你所需要的:

#include <stdint.h> 
#include <arm_neon.h> 

void subtractTwoImagesNeon(uint8_t *src, uint8_t*dst, uint8_t*result, int srcWidth, int srcHeight) 
{ 
    for (int i = 0; i<(srcWidth/8); i++) 
    { 
     // load 8 pixels 
     uint8x8_t srcPixels = vld1_u8(src); 
     uint8x8_t dstPixels = vld1_u8(dst); 
     // subtract them 
     uint8x8_t subPixels = vsub_u8(srcPixels, dstPixels); 
     // store the result 
     vst1_u8 (result, subPixels); 
     // move 8 pixels 
     src+=8; 
     dst+=8; 
     result+=8; 
    } 
} 

您也應該檢查srcWidth是8的倍數。另外,你需要包括圖像的所有行,因爲它似乎是你的代碼只處理第一行(也許你知道這一點,並簡單地減少了示例)。