1
경우 :ARM 네온하는 ARMv7 SIMD 명령어 다음 루프 네온 코드를 작성하는 방법을 비교
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);
}
당신을 감사합니다! 그것은 정말로 나에게 옳은 일을했다. –