我已经编写了一个程序,在Android平台上使用Neon处理单个浮点数组,特别是三星S4,并发现我的Neon例程受到对阵列数据访问的限制。为了利益,下面的代码段:
氖
m1 = vmulq_f32(*(float32x4_t *)&ey[i][j],*(float32x4_t *)&caey[i][j]);
m2 = vsubq_f32(*(float32x4_t *)&hz[i-1][j],*(float32x4_t *)&hz[i][j]);
m3 = vmulq_f32(*(float32x4_t *)&cbey[i][j],m2);
m4 = vaddq_f32(m1,m3);
vst1q_f32(&ey[i*je+j],m4);
串行
ey[i][j] = caey[i][j] * ey[i][j] + cbey[i][j] * ( hz[i-1][j] - hz[i][j] );
使用C4droid gcc和AIDE-JNI构建在Android手机上。上面的Neon内在函数代码比序列等效代码需要稍长的处理时间。当用虚拟const浮点数替换数组数据时,代码的运行速度几乎是带有数组数据的串行数据的4倍,尽管它当然会产生无意义的结果(这确实表明性能问题在于数据访问)。我在其他平台上的等效SSE和AVX代码可以产生很好的加速。
我尝试过1D等效数组并使用__builtin_prefetch预取数据,但无法加速对Neon内在函数的数据访问。
还有什么我可以尝试提高Android手机的数据访问性能吗?