it-swarm.com.de

Verwenden der GPU mit c #

Ich versuche, mehr Rechenleistung aus meinem Netz zu bekommen.

Ich verwende alle CPU/Kerne. Kann die GPU mit C # verwendet werden?.

Kennt jemand Bibliotheken oder Beispielcode?

123
csharpdevguy568

[Bearbeiten Sie das OKT 2017, da selbst diese Antwort ziemlich alt wird]

Die meisten dieser Antworten sind ziemlich alt, daher dachte ich, ich würde eine aktualisierte Zusammenfassung darüber geben, wo jedes Projekt meiner Meinung nach ist: 

  • GPU.Net (TidePowerd) - Ich habe es vor etwa 6 Monaten ausprobiert und es funktioniert, obwohl es ein bisschen Arbeit gekostet hat. Konvertiert C # -Kernelcode zum Zeitpunkt des Kompilierens in cuda. Leider war ihre Website nicht verfügbar und ihr Github wurde seit ein paar Jahren nicht aktualisiert, was möglicherweise darauf hinweist, dass das Projekt tot ist.

  • Cudafy - Open Source und sehr einfach zu bedienen. Konvertiert C # -Kernelcode zur Laufzeit in cuda (mit Serialisierungs- und Cache-Fähigkeit). Kann den gleichen Kernel-Code problemlos auf der CPU ausführen (meistens zum Debuggen). Unterstützt mehrere GPUs. Mehr Beispiele als andere hier. Der Boilerplate-Code, auf den andere Antworten verweisen, ist minimal und hat in meinem Fall zumindest zu meinem Verständnis der Funktionsweise des Codes beigetragen. Cuda/Nvidia allerdings nur. Leider scheint es, dass sie ihre Lösungen auch einige Jahre nicht aktualisiert haben (letztes Commit 2015 - Unterstützung von cuda 7.0).

  • Hybridizer . Kommerzielle Lösung, die C # in CUDA kompiliert. Bietet eine kostenlose Community Edition auf Visual Studio Marketplace und Samples auf Github .

  • AleaGPU Kommerzielle Lösung mit einer kostenlosen Community Edition für Consumer-GPUS. Einzelheiten finden Sie in den Kommentaren von Daniel. 

  • Brahma - führt LINQ-Ausdrücke über OpenCL aus (unterstützt auch AMD). Nicht viel Dokumentation/Beispiele. Letztes Update in 2011.

  • C $ - letzte Entwicklung vor über 10 Jahren ...

  • Microsoft Accelerator - sieht ebenfalls nicht so aus, als würde er aktiv weiterentwickelt.

  • einige andere ( C++ AMP , OpenTK - dead / Cloo ) - viele davon sind nur Bindungen, dh Sie können die GPU von C # aufrufen, aber Ihren Kernelcode (Code was wird auf der GPU ausgeführt) muss in C oder OpenCL geschrieben sein, dh Sie müssen eine andere Sprache verwenden (und lernen).

Wie gesagt, ich würde Cudafy allen anderen empfehlen - wenn es sowohl unter OpenCL als auch unter Cuda laufen könnte, wäre es perfekt.

EDIT SEP 2013 Cudafy ermöglicht jetzt das Kompilieren für beide CUDA und OpenCL, sodass auf allen GPUs derselbe C # -Code ausgeführt wird. Das hört sich fantastisch an, obwohl ich das OpenCL-Compilieren noch nicht getestet habe.

144
mcmillab

Microsoft Research Accelerator war eine GPU-Bibliothek für .NET-GPUs.

46
Mark Cidade

Ich habe Brahma ... gefunden. Es hat auch einen GPGPU-Provider, der Methoden auf der GPU laufen lässt ... Danke für die Frage ... Heute etwas Neues gelernt. :)

24
Vyas Bharghava

Könnte ich XNA Game Studio als möglichen Weg für die Erkundung empfehlen? Es ist offensichtlich für das Schreiben von Spielen gerüstet, bietet Ihnen jedoch einen verwalteten Zugriff auf Ihre Grafikkarte und einen viel besseren Zugriff auf Funktionen zur Enumerationsfunktion und Shader-Entwicklung, als dies z. B. in Managed DirectX verfügbar war. Es gibt auch Möglichkeiten, WinForms und XNA in Hybridanwendungen zu kombinieren:

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

Sie müssen sich etwas in die Programmierung der Lernshader einarbeiten (XNA unterstützt HLSL), dies kann jedoch einfacher sein als das Erlernen einer herstellerspezifischen Lösung wie der CUDA von nVidia. Der Vorteil ist, dass Sie in einer 100% verwalteten Umgebung programmieren können. Hier sind einige HLSL-Links:

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

Die GPGPU-Site ist auch ein empfohlenes Ziel für die allgemeine GPU-Programmierung:

http://gpgpu.org/

Viel Glück!

10
Dave R.

Wie wäre es mit http://www.tidepowerd.com/ GPU.NET?

9
pointernil

Hier ist noch einer: CUDAfy . Es klingt wie GPU.Net, da etwas so einfaches wie ein Methodenattribut dazu führen kann, dass die gesamte Methode auf der GPU ausgeführt wird. Im Gegensatz zu GPU.Net ist CUDAfy jedoch kostenlos und Open Source.

Es scheint, dass GPU.Net keinen Boilerplate-Code benötigt, obwohl (Laut ihren Dokumenten "automatisch vom Build-Tool eingefügt" wird), während CUDAfy dies tut.


Hier ist ein Beispiel für das Erstellen einer Anwendung mit CUDAfy.

Nun, das ist eine ziemlich alte Frage, und seit sie gefragt wurde, haben sich die Dinge sehr verändert.
Eine weitere Option für die Verwendung von .Net zum Schreiben von GPU-Code, den niemand in Alea GPU erwähnt hat. Es umfasst C #, F # und VB.

Professionelle GPU-Softwareentwicklungsumgebung für .NET und Mono . Wirklich plattformübergreifend

Auf der offiziellen F #-Site ist Alea erste Option für die Verwendung von F # in der GPGPU-Programmierung.
Um dieses Framework kennen zu lernen, schlage ich vor, seine umfassende Liste von Beispielen zu betrachten.

8
Rsh

Werfen Sie einen Blick auf C $ (ausgesprochen "C Bucks"). Von ihrem CodePlex site :

Das Ziel von [C $] ist die Schaffung einer einheitlichen Sprache und eines Systems für die nahtlose parallele Programmierung auf modernen GPUs und CPUs. 

Es basiert auf C #, wird langsam bewertet und zielt auf mehrere Beschleunigermodelle ab:

Derzeit ist die Liste von vorgesehene Architekturen umfassen GPU, Multi-Core-CPU, Multi-GPU (SLI, CrossFire) und Multi-GPU + Multi-CPU Hybridarchitektur.

7
David Cuccia

Es gibt eine neue Microsoft-Lösung in der Stadt - C++ AMP (Intro hier ).

Die Verwendung von C # wäre per P/Invoke, wie demoed hier für Desktop-Apps und hier für (nicht anrufbare) Metro-Apps.

Edit: Ich sollte beachten, dass C++ AMP eine open-Spezifikation hat, was bedeutet, dass es nicht unbedingt nur für den MS-Compiler oder nur für Windows ist. 

Edit: Anscheinend ist die Technologie jetzt im "Wartungsmodus" bedeutet, dass sie Fehler beheben, sich aber nicht aktiv entwickeln.

7
David Cuccia

Wenn Ihre GPUs alle dieselbe Marke haben, können Sie möglicherweise GPGPU-Unterstützung vom Hersteller erhalten, entweder über Nvidias CUDA oder den Stream von ATI. AFAIK, sie stellen DLLs bereit, die Sie über P/Invoke verwenden können.

2
Coderer

Managed DirectX kann irgendwie funktionieren

2
Greg Dean

Die CenterSpace-Software bietet GPU-basierte Berechnungen in ihren NMath - Bibliotheken, die Sie zum C # -Projekt hinzufügen können. Es ist ein kommerzielles Produkt. 

1
Pasi Tuomainen

Wenn Sie Ihre eigenen Algorithmen anwenden möchten, die benutzerdefinierte Kernel benötigen:

Ich habe vor kurzem ein Open-Source-Projekt von mir in dieses github-Repository hochgeladen, das OpenCL verwendet.

Was Sie tun (Sie können dies auch auf der Wiki-Seite überprüfen), ist die Auswahl mehrerer OpenCL-fähiger Geräte und eines Kernel-Strings aus dem Benutzer und das Erstellen von C # - oder C++ - Array-Wrappern, die dann mit Hilfe eines Auto-Load-Balancers und eines Compilers berechnet werden Pipeliner (um Latenzen zu verbergen), um eine gute Effizienz des PCs zu erzielen.

Hier ein Beispiel für seine Verwendung (1024 Workitems, die auf alle Geräte partitioniert sind und jeweils den gleichen Code ausführen, jedoch unterschiedliche Daten und Thread-IDs verwenden):

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

wenn alle nicht mehr verwendet werden, geben sie alle C++ - Ressourcen mit ihren Destruktoren frei.

Aber es ist nicht so ausgereift. Fühlen Sie sich frei, um ein "Problem" auf der Registerkarte "Github-Probleme" hinzuzufügen. __ Multi-PC-Cluster-relevante Klassen funktionieren nicht und sind noch nicht ins Englische übersetzt, sie können jedoch alle Geräte in einem einzelnen PC verwenden .