【问题标题】:Converting arm code to use NEON intrinsics将 arm 代码转换为使用 NEON 内部函数
【发布时间】:2013-05-08 17:42:42
【问题描述】:

我一直在尝试修改下面的代码以使用 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);
 }

【问题讨论】:

  • 您如何使用 NEON Intrinsics?到目前为止,您没有在代码中使用任何它。

标签: arm neon beagleboard intrinsics cortex-a8


【解决方案1】:

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

虽然 3 维 在这个宇宙中很常见,但我们的朋友计算机喜欢二进制。所以你有两种数据类型可以用于 NEON 内在函数; float32x4_tfloat32x2_t。您需要使用诸如vfmaq_f32vsubq_f32 等内部函数。这些内部函数因每个编译器而异;我猜你正在使用gcc。您应该只使用内部数据类型,因为将 float32x2_t 与单个 float 组合会导致寄存器类型之间的移动,这很昂贵。如果您的算法可以分别处理每个维度,那么您也许可以组合类型。但是,我认为您不会有注册 压力,SIMD 加速应该是有益的。首先,我会将所有内容保存在float32x4_t 中。在渲染阶段,您也许可以使用 3D-projection 的额外维度。

这是 LGPL 下名为 math-neoncmath 库的 source。它没有将 intrinsicsgcc 一起使用,而是使用内联汇编程序。Neon intrinsics vs assembly

另请参阅:armcc NEON intrinsics,如果您使用的是 ARM 编译器。

【讨论】:

  • OpenCV Neon Intrinscis 有一个实现,但它提供了一个用于 AVX/SSE 和其他 SIMD 指令集的 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多