将arm代码转换为使用NEON内部函数
我一直在尝试修改下面的代码以使用NEON Intrinsic,从而创建一个加速。不幸的是,似乎没有什么能正常工作。有人知道出了什么问题吗?我将double更新为单浮点元素将arm代码转换为使用NEON内部函数,arm,neon,beagleboard,intrinsics,cortex-a8,Arm,Neon,Beagleboard,Intrinsics,Cortex A8,我一直在尝试修改下面的代码以使用NEON Intrinsic,从而创建一个加速。不幸的是,似乎没有什么能正常工作。有人知道出了什么问题吗?我将double更新为单浮点元素 typedef float REAL; typedef REAL VEC3[3]; typedef struct driehoek { VEC3 norm; /* Face normal. */
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);
}
浮点向量[3]的数组不足以提示编译器可以使用NEON内在函数。问题是float-vec[3]的每个元素都可以单独寻址。编译器必须将每个存储在浮点寄存器中。见文件
虽然三维空间在这个宇宙中很常见,但我们的朋友喜欢二进制的计算机。因此,有两种数据类型可用于NEON Intrinsic;浮动32x4_t和浮动32x2_t。您需要使用内部函数,如vfmaq_f32、vsubq_f32等。这些内部函数对于每个编译器都是不同的;我猜您正在使用gcc。您应该只使用内部数据类型,因为将float32x2_t与单个float组合会导致寄存器类型之间的移动,这是非常昂贵的。如果您的算法可以单独处理每个维度,那么您可能能够组合类型。但是,我认为您不会有寄存器压力,SIMD加速应该是有益的。一开始,我会把所有东西都放在32x4上。在渲染阶段,您可能可以使用额外的维度
下面是一个名为LGPL的cmath库的示例。它使用内联汇编程序,而不是将intrinsic与gcc结合使用
另请参见:,如果您使用的是ARM编译器。浮点向量[3]数组不足以提示编译器可以使用NEON Instruction。问题是float-vec[3]的每个元素都可以单独寻址。编译器必须将每个存储在浮点寄存器中。见文件
虽然三维空间在这个宇宙中很常见,但我们的朋友喜欢二进制的计算机。因此,有两种数据类型可用于NEON Intrinsic;浮动32x4_t和浮动32x2_t。您需要使用内部函数,如vfmaq_f32、vsubq_f32等。这些内部函数对于每个编译器都是不同的;我猜您正在使用gcc。您应该只使用内部数据类型,因为将float32x2_t与单个float组合会导致寄存器类型之间的移动,这是非常昂贵的。如果您的算法可以单独处理每个维度,那么您可能能够组合类型。但是,我认为您不会有寄存器压力,SIMD加速应该是有益的。一开始,我会把所有东西都放在32x4上。在渲染阶段,您可能可以使用额外的维度
下面是一个名为LGPL的cmath库的示例。它使用内联汇编程序,而不是将intrinsic与gcc结合使用
如果您使用的是ARM编译器,请参见:。如何使用NEON Intrinsic?到目前为止,您的代码中没有使用任何一个。如何使用NEON Intrinsic?到目前为止,您在代码中没有使用任何一个。有一个实现,但理解起来更复杂,因为它为AVX/SSE和其他SIMD指令集提供了API。有一个实现,但理解起来更复杂,因为它为AVX/SSE和其他SIMD指令集提供了API。