我想改进一些使用我的应用程序CPU的25%的代码,代码是下一个:
for (int i=0; i<8; i++) {
unsigned f = *p++;
sum += f;
sqsum += f*f;
}
我制作了一些手臂代码,但它没有工作,甚至没有编译,下一个是:
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;
}
}
答案 0 :(得分:3)
该循环是NEON优化的理想选择。您可以将8个无符号整数放入单个NEON寄存器中。没有“向量的所有元素求和”指令,但您可以使用成对加法以3个步骤计算8个元素的总和。由于我们无法看到您的应用程序的其余部分,因此很难知道大局是什么,但NEON是您提高速度的最佳选择。所有最近的Apple产品都支持NEON指令,在XCode中,您可以使用与您的C ++代码混合的NEON内在函数。