Problem mit Alignment?



  • Ich dachte, dass ich mal zum Testen der SSE-Intrinsics eine kleine Vectorklasse schreibe.
    Nun kriege ich beim Testen urplötzlich Segfaults. 😞
    Dürfte also wohl am Alignment liegen...

    Momentan siehts also wie folgt aus. :

    #include <xmmintrin.h>
    
    struct Vec3f {
        union {
            __m128 vectorSSE;
            struct {
                float x;
                float y;
                float z;
                float fill;
            };
        }; 
    
        Vec3f();
        Vec3f(float value);
        Vec3f(float value1, float value2, float value3);
        Vec3f(__m128 vec);
    
        ~Vec3f() {};
    
        Vec3f operator+(const Vec3f& vec);
        Vec3f operator-(const Vec3f& vec);
        Vec3f operator*(float scalar);
        float operator*(const Vec3f& vec);
        Vec3f operator|(const Vec3f& vec);
    
        float sqLength();    
        float length();
    
    };
    

    Eigentlich müssten die Daten in der Union ja richtig aligned sein, der Inteldoku mal zu urteilen.
    Nun kann ich dies auch munter lustig benutzen bis auf die sqLength-Funktion, die eigentlich fast identsich mit der operator* ist.

    float Vec3f::operator*(const Vec3f& vec) {
        float res[4];
        __m128 temp = _mm_mul_ps(vectorSSE, vec.vectorSSE);
        __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
        temp = _mm_add_ps(temp, temp2);
        _mm_storeu_ps(res, temp);
        return res[0]+res[1];
    }
    
    float Vec3f::sqLength() {
        float res[4];
        __m128 temp = _mm_mul_ps(vectorSSE, vectorSSE);
        __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
        temp = _mm_add_ps(temp, temp2);
        _mm_storeu_ps(res, temp);
        return res[0]+res[1];
    }
    

    Des erste geht, das zweite nicht. Der Segfault tritt dabei immer im store auf, das eigentlich mit unaligned Daten ja keine Probleme haben sollte. (der gcc ignoriert mein _declspec(align(16)). Deswegen storeu.)

    Wo liegt also jetzt hier das Problem?

    Compiler ist der gcc 3.4.2 (MinGW) wenns hilft...

    Thanks schonmal
    Chris



  • Prüfe mal, ob vectorSSE an einer durch 16 teilbaren Adresse liegt.
    An welcher Stelle bekommst du eigentlich Segfaults?

    Thorn schrieb:

    der gcc ignoriert mein _declspec(align(16))

    Das liegt daran, dass dies beim GCCanders heisst, __attribute__((aligned(16))), IIRC.

    noch 2 Tipps:
    1. Dein Code ist nicht standardkonform, da es keine unnamed structs gibt.
    2. Definiere die binären Non-Assignment Operatoren ausserhalb der Klasse.


Anmelden zum Antworten