SSE, intrinsics i alignment
Napisałem klasę wektorów 3D przy użyciu wielu wewnętrznych elementów kompilatora SSE. Wszystko działało dobrze, dopóki nie zacząłem inicjować klas mających wektor 3D jako członka z nowymi. Doświadczyłem dziwnych awarii w trybie zwolnienia, ale nie w trybie debugowania i na odwrót.
Więc przeczytałem kilka artykułów i pomyślałem, że muszę wyrównać klasy będące właścicielami instancji klasy wektorowej 3D do 16 bajtów. Właśnie dodałem_MM_ALIGN16
(__declspec(align(16)
) przed takimi klasami:
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
Wydawało się, że na początku rozwiązało to problem. Ale po zmianie jakiegoś kodu mój program znów zaczął się załamywać. Przeszukałem jeszcze trochę sieć i znalazłemblog artykuł. Spróbowałem tego, co autor, Ernst Hot, zrobił, aby rozwiązać ten problem i to też działa dla mnie. Dodałem nowe i usunąłem operatorów do moich klas w następujący sposób:
_MM_ALIGN16 struct Sphere
{
// ....
void *operator new (unsigned int size)
{ return _mm_malloc(size, 16); }
void operator delete (void *p)
{ _mm_free(p); }
Vector3 point;
float radius
};
Ernst wspomina, że to podejście może być również problematyczne, ale po prostu łączy się z forum, które już nie istnieje, bez wyjaśnienia, dlaczego może to być problematyczne.
Moje pytania to:
Jaki jest problem z definiowaniem operatorów?
Dlaczego nie dodaje_MM_ALIGN16
wystarczy definicja klasy?
Jaki jest najlepszy sposób radzenia sobie z problemami z wyrównaniem pochodzącymi z intrinsics SSE?