Sto cercando di ottenere più potenza di elaborazione dalla mia griglia.
Sto usando tutti i CPU / core, è possibile utilizzare la GPU con C #.
Qualcuno conosce qualche libreria o ha qualche codice di esempio?
Sto cercando di ottenere più potenza di elaborazione dalla mia griglia.
Sto usando tutti i CPU / core, è possibile utilizzare la GPU con C #.
Qualcuno conosce qualche libreria o ha qualche codice di esempio?
Risposte:
[ Modifica OCT 2017 poiché anche questa risposta diventa piuttosto vecchia ]
La maggior parte di queste risposte sono piuttosto vecchie, quindi ho pensato di dare un riepilogo aggiornato di dove penso che ogni progetto sia:
GPU.Net (TidePowerd) - L'ho provato circa 6 mesi fa e l'ho fatto funzionare anche se ci è voluto un po 'di lavoro. Converte il codice del kernel C # in cuda al momento della compilazione. Sfortunatamente il loro sito Web non funziona e il loro github non è stato aggiornato per un paio d'anni, il che potrebbe indicare che il progetto è morto ...
Cudafy - Open source e molto facile da usare. Converte il codice del kernel C # in cuda in fase di esecuzione (con possibilità di serializzare e memorizzare nella cache). Può facilmente eseguire lo stesso codice kernel sulla CPU (principalmente per il debug). Supporta più GPU. Più esempi disponibili di altri qui. Il codice boilerplate a cui fanno riferimento altre risposte è minimo e nel mio caso almeno mi ha aiutato a comprendere come funziona il codice. Cuda / Nvidia solo però. Sfortunatamente, sembra che non abbiano aggiornato le loro soluzioni anche per un paio di anni (ultimo impegno nel 2015 - supporto di cuda 7.0).
Ibridatore . Soluzione commerciale che compila C # in CUDA. Fornisce un'edizione comunitaria gratuita sul mercato di Visual Studio e campioni su Github .
Soluzione commerciale AleaGPU con un'edizione comunitaria gratuita per GPUS consumer. Vedi i commenti di Daniel per i dettagli.
Brahma - esegue espressioni LINQ tramite OpenCL (quindi supporta anche AMD). Non c'è molta documentazione / esempi. Ultimo aggiornamento nel 2011.
C $ - l'ultimo sviluppo è stato effettuato oltre 10 anni fa ...
Microsoft Accelerator - allo stesso modo non sembra che sia stato sviluppato attivamente più a lungo.
altri ( C ++ AMP , OpenTK - dead / Cloo ) - molti di questi sono solo collegamenti - cioè consentono di chiamare la GPU da C #, ma il codice del kernel (codice che viene effettivamente eseguito sulla GPU) deve essere scritto in C o OpenCL, nel senso che devi usare (e imparare) un'altra lingua.
Come ho detto, consiglierei Cudafy su tutti gli altri - se potesse funzionare su OpenCL e su Cuda sarebbe perfetto.
EDIT SEP 2013 Cudafy ora ti permette di compilare sia per CUDA che OpenCL, quindi eseguirà lo stesso codice C # su tutte le GPU. Sembra fantastico, anche se non ho ancora testato la compilazione OpenCL.
Microsoft Research Accelerator era una libreria GPU .NET GP.
Ho trovato Brahma ... Ha anche un provider GPGPU che consente l'esecuzione di metodi sulla GPU ... Grazie per la domanda ... Oggi ho imparato qualcosa di nuovo. :)
Potrei raccomandare XNA Game Studio come possibile via di esplorazione? È ovviamente predisposto per la scrittura di giochi, ma offre un accesso gestito alla scheda grafica e un accesso molto migliore alle funzioni di enumerazione delle funzionalità e allo sviluppo di shader rispetto a quanto precedentemente disponibile in, diciamo, Managed DirectX. Esistono anche modi per combinare WinForms e XNA in applicazioni ibride:
http://www.ziggyware.com/news.php?readmore=866
Dovrai impegnarti a fondo nell'apprendimento della programmazione shader (XNA supporta HLSL), ma questo potrebbe essere un approccio più semplice rispetto all'apprendimento di una soluzione specifica del fornitore come CUDA di nVidia. Il vantaggio è che puoi programmare in un ambiente gestito al 100%. Ecco alcuni link HLSL:
http://www.ziggyware.com/weblinks.php?cat_id=9
Il sito GPGPU è anche una destinazione consigliata per la programmazione GPU generica:
Buona fortuna!
Che ne dici di http://www.tidepowerd.com/ GPU.NET?
Eccone un altro: CUDAfy . Sembra GPU.Net, in quanto qualcosa di semplice come un attributo metodo può far funzionare l'intero metodo sulla GPU. Ma a differenza di GPU.Net, CUDAfy è gratuito e open-source.
GPU.Net sembra non richiedere alcun codice boilerplate, tuttavia (secondo i loro documenti, viene "iniettato automaticamente dallo strumento di build") , mentre CUDAfy lo fa.
Ecco un esempio di creazione di un'applicazione con CUDAfy.
Bene, questa è una domanda piuttosto vecchia, e da quando è stato chiesto le cose sono cambiate molto.
Un'altra opzione per utilizzare .Net per scrivere il codice GPU, che nessuno ha menzionato nelle risposte nella GPU Alea . Copre C #, F # e VB.
Ambiente di sviluppo software GPU professionale per .NET e Mono. Veramente multipiattaforma
Nel sito ufficiale di F #, Alea è la prima opzione per utilizzare F # nella programmazione GPGPU.
Per conoscere questo framework suggerisco di dare un'occhiata al suo elenco completo di esempi .
Oltre a Brahma, dai un'occhiata a C $ (pronunciato "C Bucks"). Dal loro sito CodePlex :
L'obiettivo di [C $] è creare un linguaggio e un sistema unificati per una programmazione parallela senza soluzione di continuità su GPU e CPU moderne.
È basato su C #, valutato pigramente e si rivolge a più modelli di acceleratori:
Attualmente l'elenco delle architetture previste include GPU, CPU multi-core, multi-GPU (SLI, CrossFire) e architettura ibrida multi-GPU + multi-CPU.
C'è una nuova soluzione Microsoft in città: AMP C ++ (introduzione qui ).
L'uso da C # sarebbe tramite P / Invoke, come mostrato qui per le app desktop e qui per le app Metro (non chiamarlo).
Modifica: dovrei notare che AMP C ++ ha una specifica aperta , il che significa che non è necessariamente solo per il compilatore MS o solo per Windows.
Modifica: a quanto pare, la tecnologia è ora in "modalità di manutenzione", il che significa che stanno correggendo i bug, ma non stanno sviluppando attivamente.
Il software CenterSpace ha un calcolo basato su GPU nelle loro librerie NMath che puoi aggiungere al progetto C #. È un prodotto commerciale.
Se hai intenzione di applicare i tuoi algoritmi che richiedono kernel personalizzati:
Di recente ho caricato un mio progetto open source su questo repository github che utilizza OpenCL.
Ciò che fa (è possibile controllare anche dalla sua pagina wiki) è, selezionare più dispositivi compatibili con OpenCL e una stringa del kernel dall'utente e creare wrapper di array C # o C ++ quindi calcolare usando tutto, con l'aiuto di un bilanciamento automatico del carico e di un pipeliner (per nascondere le latenze) per ottenere una buona efficienza dal PC.
Ecco un esempio del suo utilizzo (1024 elementi partizionati su tutti i dispositivi, ognuno con lo stesso codice ma con dati e threadId diversi):
// select all GPUs and all CPUs in same pc
ClNumberCruncher gpuCpu = new ClNumberCruncher(AcceleratorType.GPU | AcceleratorType.CPU, @"
__kernel void distributeTanh(__global float * data,__global int * data2)
{
int threadId=get_global_id(0);
data[threadId]=tanh(data[threadId]);
data2[threadId]=threadId;
}
");
// a wrapper that can hold C# or C++ arrays
ClArray<float> data = new ClArray<float>(1024);
ClArray<int> data2 = new int[1024];
// load-balances "distributeTanh" on all devices more fairly
// at each repeatation of this line with same compute-id(1 here)
data.nextParam(data2).compute(gpuCpu, 1, "distributeTanh", 1024);
// threadId in kernel receives unique continuous id value for all work
// either it is in cpu or gpu doesn't matter
// compute method also has parameters to enable pipelining to
// elliminate buffer copy latencies or compute latencies
quando non vengono più utilizzati, rilasciano tutte le risorse C ++ con i loro distruttori.
Ma non è così maturo, quindi sentiti libero di aggiungere qualsiasi "problema" nella scheda problemi di github. Le classi rilevanti multi-cluster non funzionano e non sono ancora tradotte in inglese, ma possono utilizzare almeno tutti i dispositivi in un singolo PC.
WPF utilizza anche la GPU ed è possibile aggiungere shader personalizzati tramite HLSL.