Android上的霓虹灯受内存访问限制?

时间:2014-12-15 09:39:14

标签: arm neon data-access prefetch

我已经编写了一个程序,在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手机的数据访问性能吗?

0 个答案:

没有答案