我已经使用MSVC SSE内在函数编写了一些代码。
__m128 zero = _mm_setzero_ps();
__m128 center = _mm_load_ps(&sphere.origin.x);
__m128 boxmin = _mm_load_ps(&rhs.BottomLeftClosest.x);
__m128 boxmax = _mm_load_ps(&rhs.TopRightFurthest.x);
__m128 e = _mm_add_ps(_mm_max_ps(_mm_sub_ps(boxmin, center), zero), _mm_max_ps(_mm_sub_ps(center, boxmax), zero));
e = _mm_mul_ps(e, e);
__declspec(align(16)) float arr[4];
_mm_store_ps(arr, e);
float r = sphere.radius;
return (arr[0] + arr[1] + arr[2] <= r * r);
Math::Vector
类型(sphere.origin
,rhs.BottomLeftClosest
和rhs.TopRightFurthest
的类型)实际上是一个包含3个浮点数的数组。我将它们对齐到16个字节,这个代码在x64上执行正常。但是在x86上,我获得了读取空指针的访问冲突。关于它来自哪里的任何建议?
答案 0 :(得分:3)
__m128 center = _mm_load_ps(&sphere.origin.x);
_mm_load_ps()要求传递的指针是16字节对齐的。没有证据表明您确保sphere.origin.x正确对齐。如果您无法提供该保证,则需要使用_mm_loadu_ps()。