6

MSVCSSE組み込み関数を使用して記述されたコードがあります。

            __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、事実上3つのfloatの配列です。それらを16バイトにアラインしましたが、このコードはx64で正常に実行されます。しかし、x86では、nullポインターを読み取るとアクセス違反が発生します。これがどこから来たのかについて何かアドバイスはありますか?rhs.BottomLeftClosestrhs.TopRightFurthest

4

1 に答える 1

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

_mm_load_ps() では、渡されたポインターが 16 バイトでアラインされている必要があります。sphere.origin.x が適切に配置されていることを確認したという証拠はありません。その保証を提供できない場合は、代わりに _mm_loadu_ps() を使用する必要があります。

于 2012-05-07T17:25:16.583 に答える