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 つの単一 float 命令と 4 つの配列ルックアップが必要です。通常の C コードを使用した場合、速度は同じです。

これをさらに最適化する方法を知っている人はいますか? 配列ルックアップで値を直接読み取る方法は見つかりませんでした。

4

0 に答える 0