【发布时间】:2013-11-21 10:05:56
【问题描述】:
我正在 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 指令,但我认为它们并不常见......
【问题讨论】:
-
也许我遗漏了一些东西,但您的计算似乎没有使用任何循环变量 y、x 或 c。所以从这个意义上说,计算可以移到循环之外。
-
您是为 armeabi 还是 armeabi-v7a 构建?前者使用软浮动,后者使用硬浮动,但仅限于使用 ARMv7 CPU 的设备。
标签: android c++ c optimization android-ndk