2013-11-09 25 views
1

我正在寫一個圖像處理應用程序在Android上,我試圖加快它使用NDK。我有以下的for循環:優化我的內部循環(ARM,安卓ndk)

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指令,但他們不那麼常見,我認爲......

+0

也許我錯過了一些東西,但你的計算似乎沒有使用任何循環變量,y,x或c。所以從這個意義上說,計算可以移到循環之外。 –

+0

你正在爲armeabi或armeabi-v7a建設嗎?前者使用軟浮點運算,後者使用硬浮點運算,但限制您使用ARMv7 CPU的設備。 – fadden

回答

0

既然你訪問數組爲扁平結構,在3個層次循環的只有增加用於idx的值。您可以循環播放(idx = pitch3; idx < nx * ny * 3; idx ++)。

另一種選擇是移動到定點數學。你真的需要超過64位的動態範圍嗎?