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

标签 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 指令,但我认为它们并不常见......

最佳答案

由于您将数组作为平面结构进行访问,因此 3 级循环只会增加用于 idx 的值。您可以循环 for (idx = pitch3; idx < nx*ny*3; idx++)。

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

关于android - 优化我的内部循环(ARM,android ndk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19875284/

相关文章:

java - 为什么没有显示正确的布局?

android - 不同设备上的印地语字符 View 不同

android - 在 kotlin 中调用父类中的内部类不起作用

android - Cpu时钟频率可以为0吗?

c++ - 遍历链表的不同方式

C++ 与 Qt4 插件开发

c++ - std::move 是否使指针无效?

c - MPI 派生数据类型适用于 float ,但不适用于 double 。是对齐问题吗?

c - 需要打印 helloworld 的条件

c - 如何使用 c 将数组作为指针传递给函数来排序?