Streaming SIMD Extensions: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica |
ancora altra roba da en.wiki |
||
Riga 12:
Il [[Pentium 4]] della [[Intel]] implementa [[SSE2]], un'estensione del set di istruzioni SSE. Le caratteristiche principali di SSE2 sono il supporto per i numeri a virgola mobile a doppia precisione (64 bit) e il supporto per gli interi nel vettore di registri a 128 bit introdotti con SSE, il che permette al programmatore di utilizzare i registri MMX. Lo stesso SSE2 è stato esteso da [[SSE3]] introdotto con in core [[Prescott]] delle ultime generazioni di Pentium 4.
==Registri==
SSE ha aggiunto otto nuovi registri a 128 bit identificati con i codici da XMM0 a XMM7. Le estensioni [[AMD64]] (poi duplicate da Intel) hanno aggiunto altri otto registri da XMM8 a XMM15. C'è anche un nuovo registro di stato a 32 bit,il MXCSR. I registri da XMM8 a XMM15 sono accessibili solo nella modalità a 64 bit.
[[Image:XMM registers.svg|right|220px]]
Ogni registro può contenere insieme:
* quattro numeri in virgola mobile in [[singola precisione]] a 32-bit, oppure
* due numeri in virgola mobile in [[doppia precisione]] a 64-bit, oppure
* due interi a 64 bit, oppure
* quattro interi a 32 bit, oppure
* otto interi corti a 16 bit, oppure
* sedici bytes da 8 bit.
Le operazioni sugli interi hanno varianti per numeri con segno e senza segno. Le operazioni intere [[SIMD]] possono essere eseguite con gli otto registri MMX a 64 bit.
Visto che questi registri a 128 bit sono degli stati di programma addizionali che devono essere conservati dal [[sistema operativo]] durante il cambio di task, sono disabilitati per default fino a che il sistema operativo non li abilita esplicitamente. Questo richiede che il sistema operativo stesso conosca e usi la coppia di istruzioni FXSAVE e FXRSTOR, che salvano tutti i registri di stato [[x86]] e SSE in un colpo solo. Questa capacità è stata rapidamente aggiunta a tutti i sistemi operativi a 32 bit.
Poiché le istruzioni SSE lavorano anche con numeri in virgola mobile, sono molto più utili delle estensioni MMX, e l'aggiunta delle sitruzioni [[SSE2]] ne ha incrementato ancora l'appetibilità. Anche se le istruzioni MMX sono ridondanti, possono però essere eseguite in parallelo con quelle SSE, aumentando le prestazioni in alcune circostanze.
== Istruzioni SSE ==
Riga 63 ⟶ 82:
'''movaps xmm0,address-of-v1''' ;'''xmm0=v1.w | v1.z | v1.y | v1.x'''
'''addps xmm0,address-of-v2''' ;'''xmm0=v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x'''
==Differenze fra x87 FPU e SSE==
Le istruzioni FPU (x87) di solito memorizzano i risultati con 80 bit di precisione. Quando vecchi algoritmi scritti per le FPU x87 vengono adattati alle nuove estensioni SSE, che supportano solo 64 bit di precisione, alcune combinazioni di operazioni aritmetiche e insiemi di dati possono dare luogo a differenze numeriche significative: questo è molto importante nei calcoli scientifici, se il calcolo deve essere confrontato con risultati ottenuti su altre architetture hardware.
A seconda di quale interprete o compilatore viene usato e di quali ottimizzazioni vengono scelte, può essere necessario salvare temporaneamente certi dati e ricaricarli più tardi; normalmente anche i risultati della FPU x87 vengono arrotondati a 64 o a 32 bit, ma il luogo e il momento esatto in cui questo avviene può causare differenze nell'esito finale dei calcoli. Il seguente esempio di codice in [[Fortran]] 95 ne fornisce la prova: il valore corretto del terzo e ultimo numero da stampare è zero.
program ciao
real a,b,c,d
real x,y,z
a=.013
b=.027
c=.0937
d=.79
y=-a/b + (a/b+c)*EXP(d)
print *,y
z=(-a)/b + (a/b+c)*EXP(d)
print *,z
x=y-z
print *,x
end
Compilando con le istruzioni FPU x87 ed eseguendo si ottiene:
# g95 -o hi -mfpmath=387 -fzero -ftrace=full -fsloppy-char hi.for
# ./hi
0.78587145
0.7858714
5.9604645E-8
Compilando usando le estensioni SSE ed eseguendo si ottiene:
# g95 -o hi -mfpmath=sse -msse2 -fzero -ftrace=full -fsloppy-char hi.for
# ./hi
0.78587145
0.78587145
0.
== Voci correlate ==
|