Если условие в петле и неон SIMD
Я пытаюсь написать SIMD неонового уровня для ниже скалярного кода:
Скалярный код:
int *xt = new int[50];
float32_t input1[16] = {12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,12.0f,};
float32_t input2[16] = {13.0f,12.0f,9.0f,12.0f,12.0f,12.0f,12.0f,12.0f,13.0f,12.0f,9.0f,12.0f,12.0f,12.0f,12.0f,12.0f};
float32_t threshq = 13.0f;
uint32_t corners_count = 0;
float32_t threshq =13.0f;
for (uint32_t x = 0; x < 16; x++)
{
if ( (input1[x] == input2[x]) && (input2[x] > threshq) )
{
xt[corners_count] = x ;
}
}
Неон:
float32x4_t t1,t2,t3;
uint32x4_t rq1,rq2,rq3;
t1 = vld1q_f32(input1); // 12 12 12 12
t2 = vld1q_f32(input2); // 13 12 09 12
t3 = vdupq_n_f32(threshq); // 13 13 13 13
rq1 = vceqq_f32(t1,t2); // condition to check for input1 equal to input2
rq2 = vcgtq_f32(t1,t3); // condition to check for input1 greater than to threshold
rq3 = vandq_u32(rq1,rq2); // anding the result of two conditions
for( int i = 0;i < 4; i++){
corners_count = corners_count + rq3[i];
//...Not able to write a logic in neon for the same
}
Я не могу написать логику в Neon . Может ли кто-нибудь действительно направить меня к тому же. Я полностью устал думать об этой логике
1 ответ
Из-за зависимостей в вашем цикле, я думаю, вам нужно переразложить ваш код в цикл SIMD, за которым следует скалярный цикл. Псевдокод:
// SIMD loop
for each set of 4 float elements
apply SIMD threshold test
store 4 x bool results in temp[]
// scalar loop
for each bool element in temp[]
if temp[x]
xt[corners_count] = x
corner_count++
Таким образом, вы получаете преимущества SIMD для большинства операций, и вам просто нужно прибегнуть к скалярному коду для последней части.