gpt4 book ai didi

image-processing - (int) Image 上的快速图像方 block - ARM NEON 内在函数 - iOS Dev

转载 作者:行者123 更新时间:2023-12-04 06:01:09 24 4
gpt4 key购买 nike

有人能告诉我一个快速函数来找到一个 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 内在函数可用于在 1 个周期内进行多次操作。也许这就是要走的路?

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

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

最佳答案

这是一个简单的 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_Baseaaddr,这将表现最佳。和 image_sqr_Baseaaddr是 16 字节对齐的。

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

关于image-processing - (int) Image 上的快速图像方 block - ARM NEON 内在函数 - iOS Dev,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8887419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com