将arm代码转换为使用NEON intrinsic



我一直在尝试修改下面的代码与NEON intrinsic一起工作,从而创建一个加速。不幸的是,似乎没有什么工作是正确的。有人知道出了什么问题吗?我更新了双精度为单浮点元素。

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);
 }

float vec[3]数组不足以提示编译器可以使用NEON intrinsic。问题是float vec[3]的每个元素都可以单独寻址。编译器必须将它们存储在浮点寄存器中。参见gcc NEON内部文档。

虽然三维在这个宇宙中很常见,但我们的朋友电脑喜欢二进制。所以你有两种数据类型可以用于NEON intrinsic;float32x4_tfloat32x2_t。您需要使用诸如vfmaq_f32, vsubq_f32等的内在特性。这些本质对于每个编译器都是不同的;我猜你用的是gcc。您应该只使用固有数据类型,因为将float32x2_t与单个float结合使用可能导致在寄存器类型之间移动,这是昂贵的。如果您的算法可以单独处理每个维度,那么您就可以组合类型。然而,我不认为你会有寄存器压力和SIMD加速应该是有益的。我会保持一切在float32x4_t开始。在渲染阶段,你也许可以使用3d投影的额外维度。

这是LGPL下名为math-neoncmath库的源代码。它不是在gcc中使用intrinsic ,而是使用内联汇编器。Neon intrinsic vs assembly

参见:armcc NEON intrinsic,如果你使用的是ARM编译器

相关内容

  • 没有找到相关文章

最新更新