2013-05-14 3 views
1

NEON Intrinsics에서 작동하도록 코드를 수정하려고 했으므로 속도가 향상되었습니다. 불행히도 아무 것도 올바르게 작동하지 않는 것 같습니다. 아무도 무슨 일이 일어나고 있는지 전혀 모른다. double을 단일 부동 소수점 요소로 업데이트했습니다.NEON 내장 함수를 사용하도록 암 코드 변환

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_tfloat32x2_t. vfmaq_f32, vsubq_f32 등과 같은 내장 함수를 사용해야합니다. 이러한 내장 함수는 각 컴파일러마다 다릅니다. 너 gcc을 사용하고있는 것 같아. float32x2_tfloat을 결합하여 고유 한 데이터 유형 만 사용해야하므로 레지스터 유형간에 이동이 발생할 수 있습니다. 이는 비용이 많이 듭니다. 알고리즘이 각 차원을 개별적으로 처리 할 수 ​​있으면 유형을 결합 할 수 있습니다. 그러나, 나는 레지스터 압력을 가지고 있다고 생각하지 않으며 SIMD 속도 향상이 도움이되어야합니다. 나는 float32x4_t에 모든 것을 보관할 것입니다. 렌더링 단계에서는 3D-projection에 대해 추가 측정 기준을 사용할 수 있습니다.

여기 LGPL에서 math-neon이라고하는 source에서 cmath 라이브러리가 있습니다. 내장 함수gcc과 함께 사용하는 대신 인라인 어셈블러를 사용합니다. Neon intrinsics vs assembly

참조 : ARM 컴파일러를 사용하는 경우 armcc NEON intrinsics

관련 문제