Если условие в петле и неон 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 для большинства операций, и вам просто нужно прибегнуть к скалярному коду для последней части.

Другие вопросы по тегам