Domanda
Stavo leggendo una domanda sull'ottimizzazione del codice c # e una soluzione era usare c ++ con SSE. È possibile eseguire SSE direttamente da un programma c #?
Soluzione
L'imminente Mono 2.2 avrà il supporto SIMD. Miguel de Icaza ha scritto un blog sull'imminente funzione qui e l'API è < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> qui .
Anche se ci sarà una libreria che supporterà lo sviluppo durante il runtime Windows .NET di Microsoft, non avrà i vantaggi in termini di prestazioni che stai cercando a meno che non esegui il codice con il runtime Mono. Che potrebbe essere fattibile a seconda delle circostanze.
Aggiornamento: Mono 2.2 è rilasciato
Altri suggerimenti
C # può effettuare esplicitamente una chiamata SSE?
No. C # non può produrre inline IL molto meno inline x86 / amd64 assembly.
Il CLR, e più precisamente il JIT, utilizzerà SSE se è disponibile, eliminando la necessità di forzarlo nella maggior parte dei casi. Dico di più perché non sono un esperto SSE e sono sicuro che ci sono casi in cui potrebbe essere utile e JIT non effettua l'ottimizzazione.
SIMD per .NET sarà disponibile nel prossimo futuro. RyuJIT (il compilatore JIT di prossima generazione per .NET) richiesto per questa funzione ATM.
È necessario utilizzare la classe Microsoft.Numerics.Vectors.Vector<T>
dal pacchetto Microsoft.Bcl.Simd per sfruttare questa funzionalità. Codice di esempio qui .
Basato sul questo invio al forum, il compilatore MS JIT utilizza automaticamente SSE se SSE è disponibile sul computer di destinazione.
Se hai un "pezzo" di lavoro che vuoi fare, la soluzione migliore è scriverlo in C ++ usando gli intrinseci MMX / SSE e quindi creare una classe C ++ gestita molto semplice / clr che avvolga la tua funzionalità e la esponga come una classe .net. Quindi il tuo codice può semplicemente usare quell'assemblaggio come se fosse una classe normale.
Per ulteriori informazioni sugli elementi intrinseci di VC puoi dare un'occhiata a questo piccolo scherzo che ho scritto molti anni fa.
http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx
Oh - Suppongo che tu voglia usare le funzioni parallele per accelerare qualcosa. Come altri hanno sottolineato, se si desidera semplicemente spostare i dati in blocchi più grandi e simili, JIT sa già come utilizzare SSE per queste nozioni di base.
Filip è corretto. Ho un altro post più vecchio che mostra un esempio simile, ma più dettagliato. Ho effettivamente eseguito questo codice e l'ho modificato da solo per dimostrare a me stesso che funziona. Sto pensando di usare questa tecnica in un progetto in cui sto lavorando ed è per questo che sto cercando di vedere cosa potrebbe esserci di nuovo dato che è un po 'vecchio. Come suggerisce l'autore, puoi scrivere qualsiasi funzione desideri in C ++, compilarla, quindi copiare i byte nel tuo C #.
http://blogs.msdn.com/ b / devinj / archive / 2005/07/12 / 438323.aspx
Aggiungo che anche la classe CL ++ CI di Joe è una buona idea, tuttavia, non credo che il flag del compilatore sse e il flag / clr siano compatibili sullo stesso progetto. Ho appena verificato che: devi scrivere il tuo codice high perf in un progetto separato per usare il flag del compilatore SSE (/ arch: sse o / arch: sse2) come / clr non è aromatizzabile. Per fare qualcosa di molto più complesso della semplice aritmetica su alcuni input, penso che questo sia l'approccio migliore.
Recentemente Microsoft ha rilasciato una libreria vettoriale SIMD beta ( Microsoft.Bcl.Simd ) per C # che richiede l'installazione di RyuJIT CTP e funziona solo con Windows 8.
Puoi anche semplicemente usare una libreria SSE nativa e invocarla da C #. Ad esempio la libreria Yeppp, vedi questa risposta StackOverflow .
È finalmente possibile. Qui il post http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married. aspx
Sicuro che puoi (la domanda più importante è: perché dovresti? Lasciarlo solo al runtime; questo è il suo lavoro).
C # ti consente di mappare un delegato a un indirizzo di memoria. Tale indirizzo di memoria può contenere codici assembly grezzi. Puoi leggere di più su blog di Michael Giagnocavo .
Anche se non ho provato me stesso, potrebbe essere possibile utilizzare Marshal.GetDelegateForFunctionPointer .