2016-02-20 48 views
6

Il nuovo compilatore RyuJIT genera mai istruzioni CPU vettoriali (SIMD) e quando?In quali condizioni il compilatore .NET JIT esegue la vettorizzazione automatica?

Nota a margine: lo spazio dei nomi System.Numerics contiene tipi che consentono l'uso esplicito delle operazioni Vector che possono o meno generare istruzioni SIMD a seconda della CPU, versione CLR, versione JITer, indipendentemente dal fatto che vengano compilati direttamente in codice nativo. Questa domanda riguarda specificamente quando il codice non vettoriale (ad esempio in C# o F #) produrrà istruzioni SIMD.

risposta

8

La generazione del codice SIMD in RuyJIT è strettamente limitata ai tipi nello spazio dei nomi System.Numerics.Vectors. Il supporto universale SIMD richiederà una revisione molto significativa del CLR, tale codice può essere efficace solo se le variabili SIMD sono allineate correttamente. Almeno a 16 per SSE2, a 32 per essere in grado di utilizzare AVX2, a 64 per il prossimo AVX-512.

Questo è molto lontano adesso, il CLR a 32 bit può solo essere allineato a 4, la versione a 64 bit a 8. L'allineamento "naturale" per il codice a 32 bit e 64 bit. Le modifiche richieste interesseranno ogni parte del CLR, del garbage collector e del caricatore di classi in primo piano. Non c'è ronzio riguardo a un cambiamento così importante considerato. E nessun segno che fosse considerato nel progetto CoreCLR, sarebbe stata la versione di destinazione più ovvia.

Se si desidera sfruttare SIMD oltre il supporto corrente in System.Numerics.Vectors, eseguire tale operazione utilizzando il compilatore C++, utilizzando le estensioni del linguaggio C++/CLI o C++/CX per l'interoperabilità.

+0

Per quanto riguarda l'allineamento della memoria, ho trovato questo commento da Intel ... "La maggior parte delle semantiche SIMD con codifica VEX ed elaborazione dati con semantica di memoria ha requisiti di allineamento della memoria rilassati rispetto alle istruzioni codificate con i prefissi SIMD" [Intel® 64 e IA -32 Architetture Software Developer's Manual] (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1 -manual.pdf) – redcalx

+2

"Può essere solo * efficiente *" è la frase chiave. Carichi e negozi non allineati sono molto costosi. –