2013-05-14 5 views
1

Я пытаюсь изменить код для работы с NEON Intrinsics, тем самым создав ускорение. К сожалению, ничего не работает правильно. Кто-нибудь знает, что происходит не так? Я обновил двойники до отдельных элементов с плавающей запятой.Преобразование кода руки для использования NEON intrinsics

typedef   float  REAL; 
typedef   REAL  VEC3[3];  

typedef struct driehoek 
{ 
    VEC3  norm;     /* Face normal. */ 
    REAL  d;      /* Plane equation D. */ 
    VEC3  *vptr;     /* Global vertex list pointer. */ 
    VEC3  *nptr;     /* Global normal list pointer. */ 
    INT   vindex[3];    /* Index of vertices. */ 
    INT   indx;     /* Normal component max flag. */ 
    BOOL  norminterp;    /* Do normal interpolation? */ 
    BOOL  vorder;     /* Vertex order orientation. */ 
}driehoek; 

typedef struct element 
{ 
    INT   index; 
    struct object *parent;   /* Ptr back to parent object. */ 
    CHAR  *data;     /* Pointer to data info.   */ 
    BBOX  bv;      /* Element bounding volume.  */ 
}ELEMENT; 

INT TriangleIntersection(RAY *pr, ELEMENT *pe, IRECORD *hit) 
{ 
    FLOAT  Rd_dot_Pn;  /* Polygon normal dot ray direction. */ 
    FLOAT  Ro_dot_Pn;  /* Polygon normal dot ray origin. */ 
    FLOAT  q1, q2; 
    FLOAT  tval;   /* Intersection t distance value. */ 
    VEC3  *v1, *v2, *v3;  /* Vertex list pointers.   */ 
    VEC3  e1, e2, e3;  /* Edge vectors.    */ 
    driehoek *pt;   /* Ptr to triangle data.   */ 


    pt = (driehoek *)pe->data; 

    Rd_dot_Pn = VecDot(pt->norm, pr->D); 

    if (ABS(Rd_dot_Pn) < RAYEPS)  /* Ray is parallel.  */ 
     return (0); 

     hit->b3 = e1[0] * (q2 - (*v1)[1]) - e1[1] * (q1 - (*v1)[0]); 
     if (!INSIDE(hit->b3, pt->norm[2])) 
      return (0); 
     break; 
    } 

    return (1); 
} 
+0

Как вы используете NEON Intrinsics? Пока вы не используете его в своем коде. – auselen

ответ

1

Массив float vec[3] не достаточно намек на компилятор, который NEON присущий может быть использован. Дело в том, что float vec[3] имеет каждый элемент индивидуально адресуемый. Компилятор должен хранить каждый в регистре с плавающей запятой. См. Документацию gcc NEON intrinsic.

Хотя 3 измерения очень распространен в этой Вселенной, наши друзья - компьютеры, такие как двоичные. Таким образом, у вас есть два типа данных, которые могут использоваться для NEON intrinsics; float32x4_t и float32x2_t. Вам необходимо использовать встроенные функции, такие как vfmaq_f32, vsubq_f32 и т. Д. Эти встроенные функции различны для каждого компилятора; Думаю, вы используете gcc. Вы должны использовать только внутренние типы данных, поскольку объединение float32x2_t с одним float может привести к перемещению между типами регистров, что дорого. Если ваш алгоритм может обрабатывать каждый размер отдельно, тогда вы можете комбинировать типы. Тем не менее, я не думаю, что у вас будет регистр давление и SIMD ускорение должно быть полезным. Для начала я бы сохранил все в float32x4_t. Возможно, вы можете использовать дополнительное измерение для 3D-projection, когда дело доходит до фазы рендеринга.

Вот sourcecmath библиотека под названием LGPL. math-neon. Вместо использования intrinsics с gcc, он использует встроенный ассемблер. Neon intrinsics vs assembly

Смотрите также: armcc NEON intrinsics, если вы используете ARM компилятор.

Смежные вопросы