Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[x86-64] Problem z liczbami zmiennoprzecinkowymmi

Ostatnio zmodyfikowano 2016-01-03 21:31
Autor Wiadomość
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.
P-142718
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.
P-142775
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.
C/C++
; 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.
P-142820
1 « 2 »
Poprzednia strona Strona 2 z 2