2010-01-20 14 views
9

Tenendo conto del bit di disabilitazione dell'esecuzione, è il modo consigliato di eseguire le istruzioni su un processore nativo da un ambiente gestito di livello elevato come VB.NET 2008 o C#. Inoltre qualcuno ha ottenuto risultati simili nell'eseguire le istruzioni GPU contro un processore grafico?Esecuzione di istruzioni CPU/GPU dal codice gestito

+2

La vera domanda è: cosa stai cercando di realizzare? È possibile utilizzare la GPU con CUDA.NET (http://www.hoopoe-cloud.com/Solutions/CUDA.NET/Default.aspx). –

+0

L'obiettivo è eseguire calcoli personalizzati il ​​più vicino possibile al metallo nudo, ma lanciati da un ambiente gestito. – PeanutPower

+0

possibile duplicato di [Utilizzo della GPU con C#] (http://stackoverflow.com/questions/375011/utilizing-the-gpu-with-c-sharp) –

risposta

8

Ci sono alcune opzioni GPU per C#, per l'accesso diretto, senza ritornare al P/Invoke o scrivere i propri wrapper C++:

  • Brahma è abbastanza interessante. Fornisce l'accesso alla GPU direttamente tramite un provider LINQ personalizzato. Il codice include alcuni esempi di metodi altamente computazionali eseguiti sulla GPU, tutti scritti in C# tramite LINQ.
  • SlimDX fornisce un bel wrapper .NET a tutte le principali funzionalità di DirectX. Con shader personalizzati, puoi eseguire calcoli sulla GPU tramite DirectX. Include anche il supporto per DX11, quindi puoi usare direttamente gli shader compute (se hai l'hardware per farlo).
  • È possibile accedere a CUDA tramite CUDA.NET.
  • È possibile utilizzare OpenCL tramite OpenCL.NET.

Per quanto riguarda le istruzioni della CPU, questo in genere richiederebbe il passaggio al codice nativo di livello inferiore con le istruzioni dell'assemblatore. Probabilmente l'opzione più interessante completamente gestita (almeno parzialmente correlata) sarebbe quella di utilizzare Mono.Simd, che fornisce l'accesso diretto alle istruzioni SIMD nella CPU dal codice gestito quando si esegue lo stack mono.

+0

Grazie che il collegamento Mono.Simd è fantastico – PeanutPower

2

Creare la libreria .dll non gestita con le istruzioni che si desidera e utilizzare P/Invoke per chiamarla.

3

Non è un'opzione. Dovrai P/Richiamare una funzione nella DLL che è stata generata da MASM o scritta in C/C++ non gestito, usando assembly inline o intrinseche. Oppure utilizzare il compilatore C++/CLI e generare il codice in modalità mista con #pragma gestito.

Attenzione che ora non è più possibile dipendere dal compilatore JIT che genera qualsiasi codice di piattaforma adatto al sistema operativo. Usa Progetto + Proprietà, scheda Crea, Piattaforma di destinazione per forzare l'architettura a corrispondere al tuo codice non gestito.

Guarda CUDA per codice GPU gestito.

Problemi correlati