web-dev-qa-db-fra.com

Utiliser le GPU avec c #

J'essaie de tirer davantage de puissance de traitement de ma grille.

J'utilise tous les processeurs/cœurs, est-il possible d'utiliser le GPU avec C #.

Quelqu'un connaît-il des bibliothèques ou a-t-il un exemple de code?

123
csharpdevguy568

[Éditez octobre 2017 car même cette réponse devient assez ancienne _]

La plupart de ces réponses sont assez anciennes, alors je pensais donner un résumé à jour de la position de chaque projet: 

  • GPU.Net (TidePowerd) - J'ai essayé cela il y a environ 6 mois et je l'ai fait fonctionner même s'il a fallu un peu de travail. Convertit le code du noyau C # en cuda lors de la compilation. Malheureusement, leur site Web est en panne et leur github n'a pas été mis à jour depuis deux ans, ce qui pourrait indiquer que le projet est mort ....

  • Cudafy - Source ouverte et très facile à utiliser. Convertit le code du noyau C # en cuda lors de l'exécution (avec possibilité de sérialiser et de mettre en cache). Peut facilement exécuter le même code noyau sur la CPU (principalement pour le débogage). Prend en charge plusieurs GPU. Plus d'exemples disponibles que d'autres ici. Le code standard utilisé dans les autres réponses est minime et, dans mon cas, m'a au moins aidé à comprendre comment fonctionne le code. Cuda/Nvidia seulement si. Malheureusement, il semble qu'ils n'aient pas mis à jour leurs solutions depuis quelques années également (dernier engagement en 2015 - prise en charge de cuda 7.0).

  • Hybridizer . Solution commerciale compilant C # à CUDA. Fournit une édition communautaire gratuite sur visual studio marketplace et des échantillons sur github .

  • AleaGPU Solution commerciale avec une édition communautaire gratuite pour les GPUS consommateurs. Voir les commentaires de Daniel pour plus de détails. 

  • Brahma - exécute les expressions LINQ via OpenCL (prend donc également en charge AMD). Pas beaucoup de documentation/exemples. Dernière mise à jour en 2011.

  • C $ - Le dernier développement remonte à plus de 10 ans ...

  • Microsoft Accelerator - De même, il ne semble pas que le logiciel soit activement développé.

  • quelques autres ( AMP C++ , OpenTK - dead / Cloo ) - nombre d’entre elles ne sont que des liaisons - c’est-à-dire vous permettent d’appeler le GPU depuis C # est réellement exécuté sur le GPU) doit être écrit en C ou OpenCL, ce qui signifie que vous devez utiliser (et apprendre) une autre langue.

Comme je l'ai dit, je recommanderais Cudafy à tous les autres. S'il pouvait fonctionner aussi bien avec OpenCL que Cuda, ce serait parfait.

EDIT SEP 2013 Cudafy vous permet maintenant de compiler pour les deux CUDA et OpenCL, afin d'exécuter le même code C # sur tous les GPU. Cela semble fantastique, bien que je n’ai pas encore testé la compilation OpenCL.

144
mcmillab

Microsoft Research Accelerator était une bibliothèque GPU GPU .NET.

46
Mark Cidade

J'ai trouvé Brahma ... Il a également un fournisseur GPGPU qui permet aux méthodes de s'exécuter sur le GPU ... Merci pour la question ... J'ai appris quelque chose de nouveau aujourd'hui. :)

24
Vyas Bharghava

Puis-je recommander XNA Game Studio comme piste d'exploration possible? Il est évidemment conçu pour l’écriture de jeux, mais vous offre un accès géré à votre carte graphique ainsi qu’un accès bien meilleur aux fonctions d’énumération des capacités et au développement des shaders que ce qui était auparavant disponible dans Managed DirectX. Il existe également des moyens de combiner WinForms et XNA dans des applications hybrides:

http://www.ziggyware.com/news.php?readmore=866

Vous devrez faire des efforts pour apprendre la programmation par shader (XNA prend en charge HLSL), mais cette approche peut s'avérer plus simple que d'apprendre une solution spécifique à un fournisseur, telle que CUDA de nVidia. L'avantage est que vous pouvez programmer dans un environnement géré à 100%. Voici quelques liens HLSL:

http://www.ziggyware.com/weblinks.php?cat_id=9

Le site GPGPU est également une destination recommandée pour la programmation GPU à usage général:

http://gpgpu.org/

Bonne chance!

10
Dave R.

Que diriez-vous de http://www.tidepowerd.com/ GPU.NET?

9
pointernil

En voici un autre: CUDAfy . Cela ressemble à GPU.Net, dans la mesure où quelque chose d'aussi simple qu'un attribut de méthode peut entraîner l'exécution de toute la méthode sur le GPU. Mais contrairement à GPU.Net, CUDAfy est gratuit et open-source.

GPU.Net semble ne nécessiter aucun code standard, bien que (selon leur documentation, il soit "injecté automatiquement par l'outil de fabrication"), alors que CUDAfy le fait.


Ici est un exemple de construction d'une application avec CUDAfy.

Eh bien, c’est une question assez ancienne et, depuis qu’elle a été posée, les choses ont beaucoup changé.
Une autre option pour utiliser. Net pour écrire du code GPU, que personne n’a mentionné dans les réponses de Alea GPU . Il couvre C #, F # et VB.

Environnement de développement logiciel GPU professionnel pour .NET et Mono . Vraiment multiplate-forme

Dans le site officiel de F #, Alea est la première option pour utiliser F # dans la programmation GPGPU.
Pour mieux connaître ce cadre, je suggère de jeter un coup d’œil à sa liste complète de exemples .

8
Rsh

En plus de Brahma, jetez un oeil à C $ (prononcé "C Bucks"). De leur CodePlex site :

L'objectif de [C $] est de créer un langage et un système unifiés pour une programmation parallèle transparente sur les processeurs graphiques et les processeurs modernes. 

Il est basé sur C #, évalué paresseusement et cible plusieurs modèles d’accélérateur:

Actuellement la liste de les architectures prévues incluent le GPU, CPU multi-core, multi-GPU (SLI, CrossFire) et multi-GPU + Multi-CPU Architecture hybride.

7
David Cuccia

Il existe une nouvelle solution Microsoft en ville: C++ AMP (intro ici ).

Utiliser à partir de C # serait via P/Invoke, comme démontré { ici pour les applications de bureau et ici pour les applications Metro (ne pas appeler).

Edit: Je dois noter que C++ AMP a un spécification ouverte }, ce qui signifie que ce n'est pas nécessairement juste pour le compilateur MS ou pour Windows. 

Edit: Apparemment, la technologie est maintenant en "mode maintenance" ce qui signifie qu'ils corrigent des bugs, mais ne se développent pas activement.

7
David Cuccia

Si vos GPU sont tous de la même marque, vous pourrez peut-être obtenir le support GPGPU du fournisseur, via CUDA de Nvidia ou Stream d'ATI. Autant que je sache, ils fournissent des DLL, que vous pouvez utiliser via P/Invoke.

2
Coderer

DirectX géré en quelque sorte, pourrait fonctionner

2
Greg Dean

CenterSpace Software dispose d'un calcul basé sur GPU dans leurs bibliothèques NMath que vous pouvez ajouter au projet C #. C'est un produit commercial. 

1
Pasi Tuomainen

Si vous allez appliquer vos propres algorithmes nécessitant des noyaux personnalisés:

J'ai récemment téléchargé un de mes projets open-source sur ce référentiel github qui utilise OpenCL.

Ce qu’elle fait (vous pouvez aussi vérifier à partir de sa page wiki), sélectionnez plusieurs périphériques compatibles OpenCL et une chaîne de noyau de l’utilisateur, puis créez des wrappers de tableaux C # ou C++, puis calculez à l’aide de tous, à l’aide d’un équilibreur de charge pipeliner (pour masquer les latences) afin d’obtenir une bonne efficacité du pc.

Voici un exemple d'utilisation (1024 éléments de travail partitionnés sur tous les périphériques, chacun exécutant le même code mais utilisant des données et un threadId différents):

// 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

quand tous ne sont plus utilisés, ils libèrent toutes les ressources C++ avec leurs destructeurs.

Mais ce n’est pas aussi mature que ça, alors n'hésitez pas à ajouter n'importe quel "problème" dans l'onglet des problèmes de github . Les classes pertinentes multi-pc-cluster ne fonctionnent pas et ne sont pas encore traduites en anglais, mais il peut utiliser au moins tous les périphériques d'un seul ordinateur. .