Witam.
Ostatniego czasu, postanowiłem pobawić sie trochę w optymalizację obliczeń przy wykorzystaniu SSE.
Początkowo robiłem to pisząc wstawki assemblerowe, jednak po napotkaniu problemu, który tutaj opiszę, przenoisłem się na instrukcje Intrinsics.
Zaimplementowałem operator dodawania (kod w assemblerze i w c++)
__asm{
mov edx,this;
mov eax,vec;
movups xmm0,[edx];
addps xmm0,[eax];
movaps retv,xmm0;
}
return CVector3D(_mm_add_ps(_mm_load_ps(vec.c_vecData),_mm_load_ps(c_vecData)));
gdzie vec to parametr operatura + (referencja na wektor), retv wektor zwracany a c_vecData to wyrównana do 16 bajtów tablica 4 floatów.
Dla zwykłego dodawania, typu: result = v1+v2 oraz dodawania w petli dla satycznych tablic (tworzonych na stosie) wszystko działa ok.
Jednak, gdy utworzę dynamicznie tablicę wektorów (operator new) i dla niej wywołam operator+, program sypie się (Access violation). Nie przekraczam zakresu (testowałem dla elementu 0).
Debugger w pierwszym przypadku wskazywał na linijkę: movups xmm0,[edx].
Jeśli chodzi o Intrinsics, zamiana _mm_load_ps(c_vecData) na _mm_set_ps(0.0f,0.0f,0.0f,0.0f) pomaga (program nie wysypuje się), jednak już _mm_set_ps(c_vecData[0],c_vecData[1],c_vecData[2],c_vecData[3]) powoduje wyżej wspomniany błąd.
Bedę bardzo wdzięczny za pomoc w rozwiązaniu problemu
