2013-03-10 7 views
7

AMD64 Architettura di Programmatore Volume 1: Application Programming pagina 226 dice riguardanti istruzioni SSE:tipi di dati x64 SSE Manuale

Il processore non controlla il tipo di dati degli operandi di istruzioni prima di istruzioni di esecuzione. Lo li controlla solo al punto di esecuzione. Ad esempio, se il processore esegue un'istruzione aritmetica che accetta operandi a precisione doppia ma viene fornita con operandi a precisione singola mediante le istruzioni MOV , il processore prima convertirà gli operandi da precisione singola a doppia precisione prima dell'esecuzione dell'operazione aritmetica e il risultato sarà corretto. Tuttavia, la conversione richiesta può causare un peggioramento delle prestazioni.

Non capisco; Avrei pensato che i registri di ymm contenessero semplicemente 256 bit che ogni istruzione interpreta in base ai suoi operandi previsti, sta a te assicurarti che siano presenti i tipi corretti, e nello scenario descritto, la CPU funzionerebbe alla massima velocità e darebbe in silenzio risposta sbagliata.

Cosa mi manca?

+1

Forse si riferiscono al fatto che se si utilizza 'movaps' per caricare i doppi, funziona comunque? È un po 'strano dirlo come hanno fatto, soprattutto perché non c'è conversione, ma non vedo cos'altro potrebbero significare .. – harold

risposta

1

Il Intel® 64 and IA-32 Architectures Optimization Reference Manual § 5.1 dice qualcosa di simile circa mescolando interi/FP "tipi di dati" (ma curiosamente non singole e doppie):

Quando la scrittura di codice SIMD che funziona per entrambi interi e dati a virgola mobile, utilizzare il sottoinsieme di istruzioni di conversione SIMD o caricare/memorizzare le istruzioni per garantire che gli operandi di input nei registri XMM contengano gli tipi di dati definiti correttamente in modo che corrispondano all'istruzione.

Le sequenze di codice che contengono l'utilizzo incrociato producono lo stesso risultato su implementazioni diverse ma comportano una penalità significativa delle prestazioni. Utilizzo delle istruzioni SSE/SSE2/SSE3/SSSE3/SSE44.1 per operare su un tipo non corrispondente I dati SIMD nel registro XMM sono fortemente sconsigliati.

Il Intel® 64 and IA-32 Architectures Software Developer’s Manual è simularly confusione:

SSE e SSE2 estensioni definiscono operazioni su tipi di dati a virgola mobile compattati e scalari e da 128 bit SIMD tipi di dati interi digitati, ma IA-32 processori non applicare questa digitazione a livello architettonico. Loro solo lo applicano a livello di microarchitettura.

...

Pentium 4 e Intel Xeon eseguire queste istruzioni senza generare un'eccezione valida-operando (#UD) e produrrà i risultati attesi nel registro XMM0 (vale a dire, l'alta e bassa 64 I bit di ogni registro saranno trattati come un valore in virgola mobile a precisione doppia e il processore opererà su di essi di conseguenza).

...

In questo esempio: XORPS o PXOR possono essere utilizzati al posto di XORPD e si ottiene lo stesso risultato corretto.Tuttavia, a causa della mancata corrispondenza del tipo tra il tipo di dati dell'operando e il tipo di dati dell'istruzione, verrà applicata una penalità di latenza a causa delle implementazioni delle istruzioni a livello di microarchitettura.

Le penalità di latenza possono anche essere sostenute utilizzando le istruzioni di spostamento del tipo errato. Ad esempio, MOVAPS e MOVAPD possono essere utilizzati entrambi per spostare un operando a precisione singola dalla memoria a un registro XMM. Tuttavia, se viene utilizzato MOVAPD, si verificherà una penalità di latenza quando un'istruzione digitata correttamente tenta di utilizzare i dati nel registro .

Si noti che queste penalità di latenza non si verificano quando si spostano i dati dai registri XMM in memoria.

I davvero hanno idea che cosa intende per "fanno rispettare solo a livello microarchitetturali" salvo che suggerisce i diversi "tipi di dati" sono trattati differentemente dal μ arco. Ho alcune ipotesi:

  • AIUI, core x86 tipicamente utilizzare register renaming causa della carenza di registri. Forse utilizzano internamente registri diversi per operandi interi/singoli/doppi in modo che possano essere localizzati più vicino alle rispettive unità vettoriali.
  • Sembra inoltre possibile che i numeri FP siano rappresentati internamente utilizzando un formato diverso (ad esempio utilizzando un esponente più grande per eliminare denorms) e convertiti nei bit canonici solo quando necessario.
  • Le CPU utilizzano "forwarding" o "bypass" in modo che le unità di esecuzione non debbano attendere che i dati vengano scritti in un registro prima di poter essere utilizzati dalle istruzioni successive, in genere salvando un ciclo o due. Questo potrebbe non accadere tra l'intero e le unità FP.
+0

Secondo la risposta a http://stackoverflow.com/questions/6678073/ differenza-tra-movdqa-e-movaps-x86-istruzioni sembra che questo è corretto. – rwallace