1
場合:ARMネオンのARMv7 SIMD命令の次のforループのネオンコードを書くための方法を比較
float sfx[64], delta = 9.9e-5;
for(int i = 0; i < 64; i++) {
if (sfx[i] < delta) {
abq[i] = 1.0/delta;
} else {
abq[i] = 1.0/sfx[i];
}
}
私はvbslq_f32を使用しようが、私はそのパラメータを一つずつ構築しなければなりません。 NEONがなぜ仕事をするより便利な方法を提供しないのか?これを行うための良い方法はありますか?
float32x4_t vdelta = vdupq_n_f32((float)1.0/delta);
for(int i = 0; i < 64; i+=4) {
float32x4_t vsfx = vld1q_f32((const float32_t*)(sfx+i));
uint32x4_t vcon;
vcon = vsetq_lane_u32((vgetq_lane_f32(vsfx,0)<delta), vcon, 0);
vcon = vsetq_lane_u32((vgetq_lane_f32(vsfx,1)<delta), vcon, 1);
vcon = vsetq_lane_u32((vgetq_lane_f32(vsfx,2)<delta), vcon, 2);
vcon = vsetq_lane_u32((vgetq_lane_f32(vsfx,3)<delta), vcon, 3);
float32x4_t vsfxdiv;
vsfxdiv = vsetq_lane_f32((1.0/vgetq_lane_f32(vsfx,0)), vsfxdiv, 0);
vsfxdiv = vsetq_lane_f32((1.0/vgetq_lane_f32(vsfx,1)), vsfxdiv, 1);
vsfxdiv = vsetq_lane_f32((1.0/vgetq_lane_f32(vsfx,2)), vsfxdiv, 2);
vsfxdiv = vsetq_lane_f32((1.0/vgetq_lane_f32(vsfx,3)), vsfxdiv, 3);
float32x4_t vabq = vblsq_f32(vcon, vsfxdiv, vdelta);
vst1q_f32((abq+i), vabq);
}
ありがとうございます!それは本当に私にとって正しいことでした。 –