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 #?

È stato utile?

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 .

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top