NEON ASM代码的运行速度比C代码慢得多?
|
我正在尝试使用NEON在iPhone ARM上针对特定问题实施高斯-牛顿优化。下面的第一个函数是我原来的C函数。第二个是我编写的NEON asm代码。我每运行100,000次,NEON版本的时间是C版本的7-8倍。我认为加载(vld1.32)是大多数时间的工作。我通过删除一些说明进行了实验。
有人对此问题有见识吗?谢谢!
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\"
);
}
没有找到相关结果
已邀请:
4 个回复
翁茄口霉氖
氮顺
遣莫捅炭
爆刺疤灯