优化我的内循环(ARM,android ndk)

时间:2013-11-09 11:15:08

标签: android c++ c optimization android-ndk

我正在Android上编写一个图像处理应用程序,我正在尝试使用NDK加速它。我有以下for循环:

int x, y, c, idx;
const int pitch3 = pitch * 3;
float adj, result;

...

// px, py, u, u_bar are all float arrays of size nx*ny*3
// theta, tau, denom are float constants
// idx >= pitch3  
for(y=1;y<ny;++y)
{
  for(x=1;x<nx;++x)
  {
    for(c=0;c<3;++c)
    {
      adj = -px[idx] - py[idx] + px[idx - 3] + py[idx - pitch3];
      result = ((u[idx] - tau * adj) + tau * f[idx]) * denom;
      u_bar[idx] = result + theta * (result - u[idx]);
      u[idx] = result;
      ++idx;
    }
  }
}

我想知道是否有可能加快这个循环?

我认为使用定点算法不会做太多,除非真正的旧Android手机(我不打算定位)。用汇编写它会有很大的改进吗?

编辑:我知道我可以使用SIMD / NEON指令,但我认为它们并不常见......

1 个答案:

答案 0 :(得分:0)

由于您将阵列作为平面结构访问,因此3级循环仅增加了用于idx的值。你可以循环(idx = pitch3; idx&lt; nx * ny * 3; idx ++)。

另一种选择是转向定点数学。你真的需要超过64位的动态范围吗?