快速图像方形(int)图像 - ARM霓虹内在函数 - iOS开发

时间:2012-01-16 22:52:04

标签: image-processing ios5 arm simd neon

有人能告诉我一个快速函数来找到 int 图像的每个像素的平方。我需要它为iOS应用程序开发。我正在直接处理定义为

的图像的内存
int *image_sqr_Baseaaddr = (int *) malloc(noOfPixels * sizeof(int));

for (int i=0; i<newNoOfPixels; i++)
     image_sqr_Baseaaddr[i] = (int) image_scaled_Baseaaddr[i] * (int) image_scaled_Baseaaddr[i];

这显然是最慢的功能。我听说iOS上的ARM Neon内在函数可用于在一个周期内进行多次操作。也许这是要走的路?

问题在于我不是很熟悉,目前没有足够的时间学习汇编语言。因此,如果有人能够针对上述问题发布Neon内在函数代码或者在C / C ++中发布任何其他快速实现,那就太棒了。

我能在网上找到的NEON内在函数中唯一的代码是RGB到灰色的代码http://computer-vision-talks.com/2011/02/a-very-fast-bgra-to-grayscale-conversion-on-iphone/

1 个答案:

答案 0 :(得分:3)

这是一个简单的NEON实现:

#include <arm_neon.h>

// ...

int i;

for (i = 0; i <= newNoOfPixels - 16; i += 16)           // SIMD loop
{
    uint8x16_t v = vld1q_u8(&image_scaled_Baseaaddr[i]);// load 16 x 8 bit pixels

    int16x8_t vl = (int16x8_t)vmovl_u8(vget_low_u8(v)); // unpack into 2 x 16 bit vectors
    int16x8_t vh = (int16x8_t)vmovl_u8(vget_high_u8(v));

    vl = vmulq_s16(vl, vl);                             // square them
    vh = vmulq_s16(vh, vh);

    int32x4_t vll = vmovl_s16(vget_low_s16(vl));        // unpack to 4 x 32 bit vectors
    int32x4_t vlh = vmovl_s16(vget_high_s16(vl));
    int32x4_t vhl = vmovl_s16(vget_low_s16(vh));
    int32x4_t vhh = vmovl_s16(vget_high_s16(vh));

    vst1q_s32(&image_sqr_Baseaaddr[i], vll);            // store 32 bit squared values
    vst1q_s32(&image_sqr_Baseaaddr[i + 4], vlh);
    vst1q_s32(&image_sqr_Baseaaddr[i + 8], vhl);
    vst1q_s32(&image_sqr_Baseaaddr[i + 12], vhh);
}
for ( ; i < newNoOfPixels; ++i)                         // scalar clean up loop
{
    int32_t p = (int32_t)image_scaled_Baseaaddr[i];
    image_sqr_Baseaaddr[i] = p * p;
}

请注意,如果image_scaled_Baseaaddrimage_sqr_Baseaaddr都是16字节对齐,则效果最佳。

另请注意,上述代码未经测试,可能需要进一步处理。