2012-05-27 12 views

risposta

10

No, non c'è nessun scenario in .NET in cui è possibile scrivere codice macchina da soli. La generazione del codice dipende interamente dal compilatore just-in-time. È certamente in grado di personalizzare la generazione del codice in base alle funzionalità del processore della macchina. Uno dei motivi principali per cui ngen.exe deve sempre essere eseguito sul computer di destinazione. Se i nervosismi in .NET 4.5 sono stati ottimizzati per trarre vantaggio da sse4 o avx è una domanda aperta, non ho sentito nulla a riguardo. Piuttosto ne dubito, Microsoft non armeggia molto con i nervosismi, se non per correggere i bug. Molto destabilizzante e 4.5 non è una versione affiancata.

VS-11 ha tuttavia un generatore di codice aggiornato per C++. È in grado di vettorizzare automaticamente i loop e usa le istruzioni SIMD/AVX per farlo. Questo blog post lo menziona, un breve video è available here.


Aggiornamento: il new x64 jitter, attualmente in CTP e nome in codice RyuJIT, include un supporto rudimentale per le istruzioni SIMD. Il tipo SSE2, che fornisce auto-vettorizzazione. Tuttavia è bloccato piuttosto stretto nel pacchetto Microsoft.Bcl.Simd e nelle classi Vector <>, non esiste una soluzione universale per il requisito di allineamento della memoria a 16 byte che SIMD deve eseguire rapidamente.

Quanto più probabile sarà il percorso di andata in avanti è .NET Native, annunciato nell'ultima conferenza di Build. Usa il back-end del compilatore C++ per generare codice in anticipo, beneficiando automaticamente del suo supporto integrato per auto-vettorializzazione e auto-parallelizzazione. Altrimenti, senza una chiara spiegazione, ancora come è stato risolto il problema dell'allineamento della memoria. Ha i suoi problemi, Reflection è difficile e al momento è supportato solo per le app in pacchetto, il tipo le cui dipendenze di runtime possono essere determinate in anticipo. App Store e Phone di Windows.


Update: questo spedito in .NET 4.6, System.Numerics.Vectors.dll assemblaggio. Attenzione che quello incluso nel framework è "sicuro" e non corrisponde alla documentazione MSDN, manca Vector<T>. Il pacchetto Nuget (versione 4.1.0) corrisponde.

+0

Grazie per la risposta –

+2

È possibile scrivere autonomamente il codice macchina; scrivi byte in memoria e poi chiama "Marshal.GetDelegateForFunctionPointer' su di esso per ottenere un delegato che puoi chiamare. Il costo di chiamarlo vorrà dire che probabilmente non sarà comparabile con Mono.Simd, ma è certamente possibile. –

+0

https://en.wikipedia.org/wiki/NX_bit –