Utilizzo della GPU con c # [chiuso]


135

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:


156

[ 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.


31
+1 per l'aggiornamento di una domanda utile in una sorta di argomento in rapido sviluppo.
Philologon,

2
GPU Alea quantalea.com fornisce supporto CUDA per tutti i linguaggi .NET, è completamente multipiattaforma e offre la migliore esperienza di sviluppo con debug e profilazione del codice GPU .NET.
Daniel

Il supporto OpenCL in Cudafy è piuttosto negativo - non sono mai riuscito a compilare nemmeno quando il mio progetto è cresciuto. Quindi seguirò semplicemente OpenCL e creerò collegamenti a C #.
Libor,

OpenCL con Cudafy funziona bene per me, lo uso da anni ormai
mcmillab

Aggiunti collegamenti a progetti per aiutare i futuri visitatori.
Dan Atkinson,

46

Microsoft Research Accelerator era una libreria GPU .NET GP.


È stato un grande progetto con una politica delle licenze scadente. Sfortunatamente, non è più disponibile sul sito MS ...
ForNeVeR,

25

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. :)


10

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:

http://gpgpu.org/

Buona fortuna!


1
Saluti dal futuro. Anche se probabilmente una buona risposta al momento (mi sono dilettato un po 'con XNA), purtroppo XNA è ora defunto
MickyD,

@MickyD Great Scott! Quando sono entrato nel mio DeLorean e sono andato avanti fino al 2018, mi sono completamente dimenticato di aggiornare questa risposta! Se sei ancora interessato a XNA, il successore spirituale è probabilmente il MonoGame multipiattaforma: monogame.net
Dave R.

Lol. Grazie lo controllerò
MickyD


9

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.


8

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 .


1
Ho appena visto la tua risposta, cancellerò il mio post. Vedi anche l'intervista a Channel 9 di Seth Juarez qui e il tag SO qui )
David Cuccia

@DavidCuccia Ottimo lavoro nel controllare le tue vecchie risposte. E grazie anche per il collegamento al canale 9 (dicembre 2016!)
Rsh

Penso che intendi questa registrazione
Daniel

@Daniel intendevo "collegamento alla registrazione del canale 9". È stato ambiguo? Comunque, grazie per averlo sottolineato.
Rsh

@DavidCuccia scusate la confusione, il collegamento era difficile da vedere
Daniel

7

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.


7

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.


2

Managed DirectX in qualche modo, potrebbe funzionare


2
Saluti dal futuro. Sebbene all'epoca sia probabilmente una buona risposta, purtroppo MDX è ormai defunto essendo stato sostituito con XNA, anch'esso defunto.
MickyD,

2

Se le tue GPU sono tutte dello stesso marchio, potresti essere in grado di ottenere supporto GPGPU dal fornitore, tramite CUDA di Nvidia o Stream di ATI. AFAIK, forniscono DLL che è possibile utilizzare tramite P / Invoke.


1

Il software CenterSpace ha un calcolo basato su GPU nelle loro librerie NMath che puoi aggiungere al progetto C #. È un prodotto commerciale.


0

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.


-2

WPF utilizza anche la GPU ed è possibile aggiungere shader personalizzati tramite HLSL.


WPF non ha accesso al calcolo GPU GP, per quanto ne so. Quando si parla della grafica di WPF System.Windows.Media, non è vero DirectX. Molto lento rispetto alla programmazione dei vertici di livello inferiore con SharpDX o SlimDX.
Pasi Tuomainen,

Ho aggiunto un collegamento a una serie di articoli sugli effetti personalizzati con accelerazione GPU in WPF.
Mark Cidade,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.