[x86-64] Problem z liczbami zmiennoprzecinkowymmi
Ostatnio zmodyfikowano 2016-01-03 21:31
Sarth Temat założony przez niniejszego użytkownika |
» 2016-01-02 18:55:32 Dzięki za wyłapanie tego głupiego błędu, muszę być bardziej uważny. Na szczęście ten błąd był tylko w dodatkowym kodzie testowym, który i tak zaraz usunę, bo program ma przetwarzać bitmapy, a nie ciagi znaków. |
|
Elaine |
» 2016-01-03 16:33:52 Na 32-bitowych procesorach też możesz używać SSE do obliczeń FP, tyle tylko że nie każdy procesor 32-bitowy ma SSE. |
Mamy 2016 rok. Intel pierwsze procesory obsługujące SSE2 wprowadził na rynek w 2001 roku, a AMD w 2003. Obecnie obsługę SSE2 można bezpiecznie zakładać w każdym procesorze x86; procesory bez SSE2 i tak najprawdopodobniej nie byłyby w stanie uciągnąć dzisiejszych programów i systemów operacyjnych. |
|
Sarth Temat założony przez niniejszego użytkownika |
» 2016-01-03 21:31:40 Podstawy skalarów w SSE mniej więcej ogarnąłem, ale chciałbym, aby moje programy wykonywały się szybciej i dzisaj zabrałem się za operacje na wektorach i mam kłopot. ; przyjmijmy, ze xmm0 = > DWORD3 DWORD2 DWORD1 DWORD0 mov al, BYTE[ rdi ] shl rax, 32
inc rdi mov al, BYTE[ rdi ]
; cvtsi2ss xmm4, eax; operacja jest wykonywana poprawnie tylko na DWORD1 i DWORD2, ale na DWORD2 ostatni wynik byl nieprawidlowy( moze sa gdzies jeszcze inne nieprawidlowe, ale pobieznie przejrzalem i byly dobre ) cvtsi2sd xmm4, rax; operacja wykonywana jest poprawnie tylko na DWORD1, ale na DWORD2 tez ostatni wynik byl nieprawidlowy
inc rdi mov bl, BYTE[ rdi ] cvtsi2ss xmm1, ebx
movlhps xmm4, xmm1
mulps xmm4, xmm0 ; addps xmm4, xmm0
movhlps xmm5, xmm4
cvtss2si ebx, xmm5 mov BYTE[ rdi ], bl dec rdi
; cvtss2si eax, xmm4 cvtsd2si rax, xmm4
mov BYTE[ rdi ], al dec rdi
shr rax, 32 mov BYTE[ rdi ], al
Myślałem tez, aby skorzystać z SSE4 i instrukcji takich jak pinsrb xmm1, al, 0x00 (to oznacza wczytanie al do DWORD0 xmm1?) i pextrb eax, xmm1, 0x08 (a to zapisanie w eax, DWORD2 xmm1?) dzięki czemu byłoby krócej i szybciej, ale też mi nie działa :( Nie wiem czy dobrze rozumiem działanie tych masek. Edit: Jakby co to udało mi się już wczoraj rozwiązać ten problem korzystając z MMX. Zdaję sobie sprawę, że dzięki nowszym zestawom instrukcji kod mógłby być krótszy, a program mógłby wykonywać się szybciej, więc jak będę miał więcej czasu to postaram się nauczyć i napisać trochę kodu z wykorzystaniem SSE4, albo i AVX. |
|
1 « 2 » |