Newsgroup: it.comp.hardware.cpu
Titolo: Una analisi di 3DNow!

Della serie "Tutto quello che avreste voluto sapere su 3DNow!
e che non avete mai osato chiedere", cerchero' di analizzare
a fondo tutte le caratteristiche di 3DNow! per evidenziarne
pregi e difetti. Ovviamente con tutti i limiti del caso.
Si accettano critiche.
Come tutti sanno 3DNow! e' un nuovo set d'istruzioni che
operano su numeri in floating point a singola precisione
specificatamente pensate per ottenere elevate prestazioni
sui piu' comuni algoritmi impiegati nelle applicazioni
multimediali.
Il set d'istruzioni e' costituito da 21 nuove istruzioni di
tipo SIMD piu' un altro paio usate per scopi speciali.
Ho trovato inutile elencare tutte le 21 istruzioni con le
loro funzionalita' perche' tanto e' possibile scaricarsi
il manuale 21928c.pdf al sito di AMD. Cerchero' quindi di
mettere in evidenza gli elementi di novita'.
Addizione
Sottrazione
Sottrazione invertita
Moltiplicazione
Confronto (maggiore uguale, maggiore, uguale)
Massimo
Minimo
Conversione da intero 32bit a fp
Conversione da fp a intero 32bit
Queste sono delle banali istruzioni aritmetiche che ovviamente
non hanno bisogno di ulteriori spiegazioni.
E' molto importante invece vedere come e' ottenuto il parallelismo
di queste istruzioni.
Per far cio' immaginate che questo sia un registro a 80bit della FPU:
   ____ ________________
  |____|________________|
  79   63               0
Le istruzioni 3DNow! usano solamente la parte meno significativa del
registro, cioe' i bit da 0 a 63 esattamente come le istruzioni MMX.
Un numero fp a singola precisione occupa, secondo lo standard IEEE 754
32 bit, quindi in ogni registro ce ne possono stare due nel seguente
modo:
   ________ ________
  |___fp1__|___fp2__|
  63       31       0
L'addizione e' fatta cosi':
                       ________ ________
  reg/mem sorgente    |__1.2___|__3.4___|
                          +        +
                       ________ ________
  reg destinazione    |__0.7___|__1.6___|
                          =        =
                       ________ ________
  reg destinazione    |__1.9___|__5.0___|
Come si vede e' possibile eseguire 2 addizioni fp alla volta
in un singlo ciclo di clock. La stessa cosa vale per la
sottrazione, moltiplicazione, reciproco, reciproco della radice
quadrata ecc, ecc. Tutte le istruzioni sono "fully pipelined".
Vediamo ora le "chicche":
PAVGUSB -- Packed 8-bit Unsigned Integer Averaging
Questa istruzione calcola la media tra gli otto valori interi
senza segno del registro/memoria sorgente e i rispettivi otto
valori del registro destinazione. E' un'istruzione particolarmente
potente perche' calcola la media di 8+8 byte in _parallelo_
Nota:
Un'istruzione come questa poteva benissimo essere gia' presente
nelle istruzioni MMX di Intel e invece...
PFACC -- Packed Floating-Point Accumulate
E' una somma fatta all'interno del registro sorgente, ideale
per il calcolo vettoriale.
PFRCP -- Packed Floating-Point Reciprocal Approximation
Bene, entriamo nel vivo dell'argomento. Come si puo' arguire
questa istruzione calcola una approssimazione del reciproco.
Qualcuno si potrebbe chiedere perche' mai venga calcolata una
approssimazione che sara' causa di un errore nei calcoli che
seguiranno. Ci sono due motivi: il primo e' banale, la velocita'
di esecuzione (AMD parla di 1 ciclo di clock, dico... uno!). Il
secondo motivo e' che in molte applicazioni quasi mai e' richiesta
una precisione di calcolo assoluta. Nel momento in cui si volesse
tale precisione esistono comunque delle istruzioni che in una decina
di cicli forniscono il risultato corretto, le vedremo in seguito.
Teoricamente questa istruzione puo' fare un K6II una ventina di
volte piu' veloce di un PII di pari frequanza, basta fare qualche
calcoletto sui tempi di esecuzione delle istruzioni.
PFRSQRT Packed Floating-Point Reciprocal Square Root Approximation
Stesse considerazioni di prima, questa volta con un ulteriore
vantaggio a favore di AMD.
PFRCPIT1 Packed Floating-Point Reciprocal
         First Iteration Step
PFRSQIT1 Packed Floating-Point Reciprocal Square Root
         First Iteration Step
PFRCPIT2 Packed Floating-Point Reciprocal/Reciprocal Square Root
         Second Iteration Step
Queste sono le tre istruzioni che completano le approssimazioni.
La terza e' uguale per entrambe.
PMULHRW Packed 16-bit Integer Multiply with rounding.
Qui torniamo sugli interi. Un'istruzione simile e' gia' presente
su MMX ma questa in un certo senso la migliora ottenendo un
arrotondamento del risultato.
Le istruzioni per "scopi speciali" che ho citato prima sono queste:
FEMMS Faster entry/exit of the MMX or floating-point state
PREFETCH Prefetch at least a 32-byte line into L1 data cache (Dcache)
La prima e' una versione meno restrittiva e piu' veloce (molto)
della sua collega MMX EMMS. In pratica si annulla o quasi il
ritardo del famoso switch tra MMX e FPU.
La seconda invece e' di tutt'altra natura. Effettua il prefetch
cioe' il prelievo di una o piu' linee (o blocchi) di cache in
anticipo, prima che i dati vengano effettivamente richiesti. E'
molto importante perche' consente di far risparmiare un sacco
di cicli persi andando a prendere i dati nella RAM.
La carrellata delle istruzioni finisce qui.
Ora vediamo pregi e difetti di 3DNow!.
Difetti cronici sostanziali non ve ne sono. Il set d'istruzioni
e' ristretto ma sufficiente per tutte le applicazioni general
purpose. Tuttavia la presenza di un'istruzione moltiplica-somma
sarebbe stata un vero toccasana dato che e' fondamentale nel
calcolo vettoriale. Una tale istruzione e' presente sia nella
FPU che nell'unita' vettoriale dei PowerPC mentre udite udite
non e' presente neanche nei processori Alpha.
La colpa della sua assenza non e' di AMD ma e' una limitazione
intrinseca dell'architettura x86 che non consente di avere due
operandi sorgente.
Un'altro difetto e' l'assenza di un set completo di istruzioni
per la media. L'istruzione PAVGUSB la fa' solo sugli interi senza
segno a 8 bit (1 byte).
3DNow! non e' stato progettato per software di number crunching
ne' tanto meno per essere sfruttato da pacchetti tipo Mathematica
dove la singola precisione e' insufficiente. Questa non e' una
lacuna ma limiti prestabiliti di progetto.
Che altro dire, per quanto riguarda la sfruttabilita' di queste
istruzioni nelle applicazioni si e' gia' detto tutto. Saranno
incapsulate in DirectX 6.0 per cui basta installarlo e ai
programmi bastera' una semplice chiamata di funzione. Sempre che
tali programmi vengano progettati per fare queste chiamate!
Sembra comunque che le nuove 21 istruzioni saranno accolte
piu' favorevolmente di quanto non lo siano state le 57 di MMX.
La speranza e' che si raggiunga un "numero critico" di applicazioni
superato il quale 3DNow! si possa automaticamente affermare.

 Si accettano critiche.
Altro che critiche...una standing ovation semmai !! ;o)))
COmplimenti...