我已经使用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.originrhs.BottomLeftClosestrhs.TopRightFurthest的类型)实际上是3个浮点数的数组。我将它们对齐为16个字节,并且此代码在x64上可以正常执行。但是在x86上,读取空指针时出现访问冲突。关于这来自何处的任何建议?

最佳答案

        __m128 center = _mm_load_ps(&sphere.origin.x);

_mm_load_ps()要求传递的指针是16字节对齐的。没有证据表明您确保sphere.origin.x正确对齐。如果您不能提供该保证,则需要使用_mm_loadu_ps()来代替。

关于c++ - 无法在x86上以SSE类型访问内存,但在x64上可以正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10484985/

10-13 07:06