我正在嘗試使用NEON在iPhone ARM上針對特定問題實現Gauss-Newton優化。下面的第一個函數是我的原始C函數。第二個是我寫的NEON asm代碼。我跑了10萬次,NEON版本比C版長7-8倍。我認爲加載(vld1.32)是大部分時間需要的。我嘗試刪除一些說明。NEON ASM代碼運行速度比C代碼慢嗎?
有沒有人有任何洞察到這個問題?謝謝!
template<class T>
inline void GaussNewtonOperationJtr8x8(T Jtr[8], const T J[8], T residual)
{
Jtr[0] -= J[0]*residual;
Jtr[1] -= J[1]*residual;
Jtr[2] -= J[2]*residual;
Jtr[3] -= J[3]*residual;
Jtr[4] -= J[4]*residual;
Jtr[5] -= J[5]*residual;
Jtr[6] -= J[6]*residual;
Jtr[7] -= J[7]*residual;
}
inline void GaussNewtonOperationJtr8x8_NEON(NFloat Jtr[8], const NFloat J[8], NFloat residual)
{
__asm__ volatile (
// load Jtr into registers
"vld1.32 {d0-d3}, [%0]\n\t"
// load J into registers
"vld1.32 {d4-d7}, [%1]\n\t"
// load residual in register
"vmov.f32 s16, %2\n\t"
// Jtr -= J*residual
"vmls.f32 q0, q2, d8[0]\n\t"
"vmls.f32 q1, q3, d8[0]\n\t"
// store result
"vst1.32 {d0-d3}, [%0]\n\t"
// output
:
// input
: "r"(Jtr), "r"(J), "r"(residual)
// registers
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14"
);
}
我還沒有看到GCC編譯器生成的代碼NEON。所以我正在通過自己生成ASM NEON代碼並與C代碼進行比較來進行試驗。 – paul 2011-05-17 17:59:50
已更新的答案。 – karlphillip 2011-05-17 18:06:06
我更仔細地閱讀了此鏈接。所以我想我的例子使用NEON不能很好地執行。我移動指令去除依賴,但我沒有任何改進。 – paul 2011-05-17 18:49:39