2009-05-18 14 views
19

Ho letto le estensioni del set di istruzioni x86 e mi sembrano utili solo in alcune circostanze piuttosto specifiche (ad esempio HADDPD - (Horizontal-Add-Packed-Double) in SSE3). Questi richiedono un determinato layout del registro che deve essere impostato intenzionalmente, o che si verifichi dalla serie di istruzioni precedenti. Quante volte i compilatori generici come gcc usano effettivamente queste istruzioni (o un loro sottoinsieme) o sono principalmente da usare nell'assemblatore codificato a mano? In che modo il compilatore rileva dove è appropriato utilizzare le istruzioni SIMD?In che modo i compilatori moderni usano le istruzioni mmx/3dnow/sse?

risposta

22

Generalmente, alcuni compilatori li usano. GCC e Visual Studio non sono generalmente in grado di utilizzare le istruzioni SIMD. Se abiliti SSE come flag del compilatore, userà le istruzioni SSE scalari per le normali operazioni in virgola mobile, ma generalmente non ti aspetti che le vettori siano usate automaticamente. Le versioni recenti di GCC potrebbero essere in grado di utilizzarle in alcuni casi, ma non hanno funzionato l'ultima volta che ho provato. Il compilatore C++ di Intel è l'unico grande compilatore che conosca che sia in grado di auto-vettorizzare alcuni loop.

In generale, però, dovrai usarli tu stesso. Sia nell'assemblatore non elaborato, sia usando le intrinseche del compilatore. In generale, direi che gli intrinsechi sono l'approccio migliore, dal momento che consentono al compilatore di comprendere meglio il codice, quindi programmano e ottimizzano, ma in pratica so che MSVC almeno non genera sempre codice molto efficiente da intrinseco, così semplice ASM potrebbe essere la soluzione migliore lì. Sperimenta, guarda cosa funziona. Ma non aspettarti che il compilatore usi queste istruzioni per te, a meno che tu non usi 1) il compilatore giusto, e 2) scriva loop abbastanza semplici che possano essere banalmente vettorizzati.

Aggiornamento 2012
Ok, quindi tre anni sono passati da quando ho scritto questa risposta. GCC è stato in grado di auto-vettorizzare (semplice) il codice per un paio d'anni, e in VS2012, MSVC , infine, ottiene la stessa capacità. Ovviamente, la parte principale della mia risposta vale ancora: i compilatori possono ancora solo vettorizzare codice abbastanza banale. Per qualcosa di più complesso, sei bloccato a giocherellare con intrinseci o in linea asm.

+0

Gli intrinsechi sono diventati (molto) migliori negli ultimi anni? L'ultima volta che ho controllato, sia MSVC che ICC avevano un'allocazione del registro piuttosto scadente, e anche io ero facilmente in grado di battere la versione intrinseca del compilatore con l'assembly codificato a mano. – snemarch

+0

Credo che le versioni recenti di MSVC abbiano apportato * alcuni * miglioramenti al codice generato da intrinseca. Ma non so quanta differenza abbia fatto. – jalf

+0

L'output di MSVC per SSE scalare è ancora terribile, soprattutto se si utilizza un'intrinseca ovunque. – Crashworks

-10

Probabilmente non li userei se potessi. Attenzione alle incompatibilità Intel/AMD. Questo può essere un consiglio ormai obsoleto, oppure no. Non ho modo di dirlo.

MODIFICA: obsoleto, probabilmente da molto tempo.

+0

Questo è un motivo abbastanza debole per evitare tali istruzioni. Non esisterebbero se non servissero a uno scopo. –

+0

Hai un compilatore che fa entrambi i turbo? Sono sicuro di no. – Joshua

+0

Questo è solo errato, tutti i moderni processori Intel e AMD e tutti i moderni compilatori (GCC, VS) supportano SSE e MMX. – Zifre

4

La questione di come sfruttare SSE e le altre unità piccolo vettore automaticamente (senza direzione dal programmatore in forma di costrutti linguistici speciali o appositamente benedetti compilatore "intrinseche") è stato un argomento di ricerca del compilatore per qualche tempo. La maggior parte dei risultati sembra essere specializzata in un particolare dominio problematico, come ad esempio digital signal processing. Non ho tenuto il passo con la letteratura su questo argomento, ma quello che ho ha letto suggerisce che lo sfruttamento del vettore (SSE) unità è ancora un argomento per la ricerca, e che uno dovrebbe avere basse aspettative di compilatori generici comunemente usati in il campo.

consigliata termine di ricerca: vettorializzazione compilatore

0

Se si utilizza il compilatore pascal vettore otterrete il codice SIMD efficiente per i tipi per i quali SIMD dà un vantaggio. Fondamentalmente questo è qualcosa di lunghezza inferiore a 64 bit. (per i real a 64 bit è in realtà più lento fare SIMD). Le ultime versioni del compilatore si confronteranno automaticamente con i core

+0

reale a 64 bit, noto anche come 'double', vantaggi di SIMD su qualsiasi CPU con SSE2, ad eccezione forse di Pentium-M/Core Solo in cui gli operatori vettoriali a 128 bit sono stati divisi in due metà a 64 bit e le istruzioni multi-uop causano colli di bottiglia di decodifica. Su qualsiasi cosa dopo Core2 o AMD K10, SIMD è una chiara vittoria anche per 'double'. –

Problemi correlati