ARM NEON,从索引数组设置通道?

时间:2013-01-19 22:56:40

标签: android android-ndk java-native-interface arm neon

我这里有一些源代码可以进行线性插值,但需要4个值,每个值都由索引赋予数组:

float32x4_t fraction = ... (4 floats in range 0<f<1)

uint32x4_t idxA = ... (4 indices into float array)
uint32x4_t idxB = ... (4 indices into float array)

uint32_t indicesA[4];   vst1q_u32( indicesA, idxA );
uint32_t indicesB[4];   vst1q_u32( indicesB, idxB );

float32x4_t arrValuesA, arrValuesB;

arrValuesA = vsetq_lane_f32(_arr[indicesA[0]], arrValuesA, 0 );
arrValuesA = vsetq_lane_f32(_arr[indicesA[1]], arrValuesA, 1 );
arrValuesA = vsetq_lane_f32(_arr[indicesA[2]], arrValuesA, 2 );
arrValuesA = vsetq_lane_f32(_arr[indicesA[3]], arrValuesA, 3 );

arrValuesB = vsetq_lane_f32(_arr[indicesB[0]], arrValuesB, 0 );
arrValuesB = vsetq_lane_f32(_arr[indicesB[1]], arrValuesB, 1 );
arrValuesB = vsetq_lane_f32(_arr[indicesB[2]], arrValuesB, 2 );
arrValuesB = vsetq_lane_f32(_arr[indicesB[3]], arrValuesB, 3 );

float32x4_t diff = vsubq_f32(arrValuesA, arrValuesB);

float32x4_t result = vmlaq_f32( arrValuesA, diff, fraction );

“问题”是,它不够快,它需要4个单浮点指令和4个数组查找来为每个通道供电。如果我使用普通的C代码,速度是一样的。

任何人都知道如何进一步优化这个?我没有找到任何直接通过数组查找读取值的指令。

0 个答案:

没有答案