1

我这里有一些源代码可以进行线性插值,但需要 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 代码,速度是一样的。

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

4

0 回答 0