gpt4 book ai didi

objective-c - 用于计算平均标准偏差的 Arm 循环代码优化

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:01 24 4
gpt4 key购买 nike

我想改进一些使用 25% 的应用程序 CPU 的代码,代码如下:

for (int i=0; i<8; i++) {
unsigned f = *p++;
sum += f;
sqsum += f*f;
}

我做了一些 arm 代码,但它不工作,甚至不能编译,这是下一个:

void loop(uint8_t * p , int *  sum ,int * qsum)
{

__asm__ volatile("vld4.8 {d0}, [%0]! \n"
"mov r4, #0 \n"
"vmlal.u8 [%1]!, [%1]!, d0 \n"
"vmull.u8 r4, d0 , d0 \n"
"vmlal.u8 [%2]!, [%2]!, r4\n"
:
: "r"(p), "r"(sum), "r"(qsum)
: "r4"
);
}

有什么帮助吗?

这是我要改进的功能:

void calculateMeanStDev8x8(cv::Mat* patch, int sx, int sy, int& mean, float& stdev)
{

unsigned sum=0;
unsigned sqsum=0;

for (int j=0; j< 8; j++) {
const unsigned char* p = (const unsigned char*)(patch->data + (j+sy)*patch->step + sx); //Apuntador al inicio de la matrix

//The code to improve
for (int i=0; i<8; i++) {
unsigned f = *p++;
sum += f;
sqsum += f*f;
}
}

mean = sum >> 6;
int r = (sum*sum) >> 6;
stdev = sqrtf(sqsum - r);

if (stdev < .1) {
stdev=0;
}
}

最佳答案

该循环非常适合 NEON 优化。您可以将 8 个无符号整数放入单个 NEON 寄存器中。没有“对 vector 的所有元素求和”指令,但您可以使用成对加法分 3 步计算 8 个元素的总和。由于我们看不到您的应用程序的其余部分,因此很难知道大局是什么,但 NEON 是提高速度的最佳选择。所有最新的 Apple 产品都支持 NEON 指令,在 XCode 中,您可以将 NEON 内在函数与 C++ 代码混合使用。

关于objective-c - 用于计算平均标准偏差的 Arm 循环代码优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984003/

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