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.