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
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.
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.
Questo è un motivo abbastanza debole per evitare tali istruzioni. Non esisterebbero se non servissero a uno scopo. –
Hai un compilatore che fa entrambi i turbo? Sono sicuro di no. – Joshua
Questo è solo errato, tutti i moderni processori Intel e AMD e tutti i moderni compilatori (GCC, VS) supportano SSE e MMX. – Zifre
Mono può utilizzare le estensioni SIMD finché si utilizzano le sue classi per i vettori. Puoi leggere qui: http://tirania.org/blog/archive/2008/Nov-03.html
GCC dovrebbe fare un po 'di vettorizzazione automatica a condizione che tu stia usando -O3
o una bandiera specifica. Hanno una pagina di informazioni qui: http://gcc.gnu.org/projects/tree-ssa/vectorization.html
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
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
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'. –
- 1. In che modo i moderni compilatori di ottimizzazione determinano quando ottimizzare?
- 2. In che modo le persone usano Yeoman?
- 3. In che modo i programmi/compilatori/interpreti clojure effettivamente "funzionano"?
- 4. Le procedure BLAS Livello 1 sono ancora rilevanti per i moderni compilatori fortran?
- 5. In che modo le CPU implementano istruzioni come MUL/MULT?
- 6. Il modo migliore per testare i repository che usano DbContext
- 7. I compilatori C++ possono ottimizzare le istruzioni "if" all'interno dei cicli "for"?
- 8. In che modo i compilatori C++ passano effettivamente i parametri di riferimento?
- 9. In che modo i browser moderni implementano JS Array, in particolare aggiungendo elementi?
- 10. Come si usano le clausole IN con le istruzioni preparate su mysqli
- 11. Un modo per ignorare i possibili avvisi di eccezione di riferimento null quando si usano le istruzioni di Assert?
- 12. Compilatori che supportano C11
- 13. Perché le persone usano i = i + 1 invece di i ++?
- 14. In che modo configurare ottimizzare le importazioni al volo senza riorganizzare le istruzioni di importazione?
- 15. Perché alcuni compilatori usano "a.out" come nome predefinito per i file eseguibili?
- 16. I compilatori C/C++ stanno ottimizzando le unità di compilazione?
- 17. Perché le persone non usano i tetraedri per le skybox?
- 18. Quali compilatori utilizzano i runtime in JavaScript?
- 19. Dove le istruzioni SSE superano le normali istruzioni
- 20. I compilatori rimuovono funzioni non utilizzate, definizioni, variabili, macro, ecc.
- 21. In che modo le istruzioni di salto nell'assieme funzionano con più processi?
- 22. Come si usano le spline in pythonOCC?
- 23. Come si usano i CSS in Django?
- 24. Array che usano il comandante
- 25. Le fabbriche astratte usano "nuovo"?
- 26. Tipi di va_list corrispondenti tra i compilatori
- 27. In che modo SQL Server tratta le istruzioni all'interno delle stored procedure rispetto alle transazioni?
- 28. I browser moderni limitano ancora i download paralleli?
- 29. Le CTE usano spazi in tempdb?
- 30. Come posso fare in modo che PyCharm riconosca i segnaposto nelle istruzioni SQL?
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
Credo che le versioni recenti di MSVC abbiano apportato * alcuni * miglioramenti al codice generato da intrinseca. Ma non so quanta differenza abbia fatto. – jalf
L'output di MSVC per SSE scalare è ancora terribile, soprattutto se si utilizza un'intrinseca ovunque. – Crashworks