Arm循环代码优化

时间:2012-01-24 08:45:09

标签: objective-c c arm optimization

我想改进一些使用我的应用程序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;
}

}

1 个答案:

答案 0 :(得分:3)

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