Verwenden der GPU mit c # [geschlossen]


135

Ich versuche, mehr Rechenleistung aus meinem Netz herauszuholen.

Ich verwende alle CPUs / Kerne, ist es möglich, die GPU mit C # zu verwenden.

Kennt jemand Bibliotheken oder hat einen Beispielcode?

Antworten:


156

[ 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 sich meines Erachtens jedes Projekt befindet:

  • GPU.Net (TidePowerd) - Ich habe es vor ungefähr 6 Monaten versucht und es zum Laufen gebracht, obwohl es ein wenig Arbeit gekostet hat. Konvertiert C # -Kernel-Code zur Kompilierungszeit in Cuda. Leider ist ihre Website nicht verfügbar und ihr Github wurde seit einigen Jahren nicht mehr aktualisiert, was darauf hindeuten könnte, dass das Projekt tot ist.

  • Cudafy - Open Source und sehr einfach zu bedienen. Konvertiert C # -Kernel-Code zur Laufzeit in Cuda (mit der Möglichkeit, zu serialisieren und zwischenzuspeichern). Kann problemlos denselben Kernel-Code auf der CPU ausführen (hauptsächlich zum Debuggen). Unterstützt mehrere GPUs. Mehr Beispiele als andere hier. Der Boilerplate-Code, auf den in anderen Antworten verwiesen wird, ist minimal und hat in meinem Fall zumindest zu meinem Verständnis der Funktionsweise des Codes beigetragen. Nur Cuda / Nvidia. Leider scheinen sie ihre Lösungen auch einige Jahre lang nicht aktualisiert zu haben (letztes Commit im Jahr 2015 - Unterstützung von cuda 7.0).

  • Hybridisierer . Kommerzielle Lösung zum Kompilieren von C # zu CUDA. Bietet eine kostenlose Community-Edition auf dem Visual Studio-Marktplatz und Beispiele auf Github .

  • AleaGPU Commercial-Lösung mit einer kostenlosen Community-Edition für Consumer-GPUS. Siehe Daniels Kommentare für Details.

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

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

  • Microsoft Accelerator - sieht ebenfalls nicht so aus, als würde es nicht mehr aktiv entwickelt.

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

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

EDIT SEP 2013 Mit Cudafy können Sie jetzt sowohl für CUDA als auch für OpenCL kompilieren , sodass auf allen GPUs derselbe C # -Code ausgeführt wird. Das klingt fantastisch, obwohl ich die OpenCL-Kompilierung noch nicht getestet habe.


31
+1 für die Aktualisierung einer nützlichen Frage in einer Art sich schnell entwickelndem Thema.
Philologon

2
Alea GPU quantalea.com bietet CUDA-Unterstützung für alle .NET-Sprachen, ist vollständig plattformübergreifend und bietet die beste Entwicklererfahrung beim Debuggen und Profilieren von .NET-GPU-Code.
Daniel

Die OpenCL-Unterstützung in Cudafy ist ziemlich schlecht - ich habe es nie geschafft, zu kompilieren, als mein Projekt größer wurde. Daher werde ich bei einfachem OpenCL bleiben und Bindungen an C # herstellen.
Libor

OpenCL mit Cudafy funktioniert gut für mich, ich benutze es seit Jahren
mcmillab

Es wurden Links zu Projekten hinzugefügt, um zukünftigen Besuchern zu helfen.
Dan Atkinson

46

Microsoft Research Accelerator war eine .NET GP-GPU-Bibliothek.


Das war ein großartiges Projekt mit einer schlechten Lizenzpolitik. Leider nicht mehr auf der MS-Website verfügbar ...
ForNeVeR

25

Ich habe Brahma gefunden ... Es gibt auch einen GPGPU-Anbieter, mit dem Methoden auf der GPU ausgeführt werden können ... Danke für die Frage ... Ich habe heute etwas Neues gelernt. :) :)


10

Könnte ich XNA Game Studio als möglichen Weg zur Erkundung empfehlen? Es ist offensichtlich auf das Schreiben von Spielen ausgerichtet, bietet Ihnen jedoch einen verwalteten Zugriff auf Ihre Grafikkarte und einen viel besseren Zugriff auf Funktionen zur Aufzählung von Funktionen und zur Entwicklung von Shadern als dies beispielsweise in Managed DirectX bisher möglich war. Es gibt auch Möglichkeiten, WinForms und XNA zu Hybridanwendungen zu kombinieren:

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

Sie müssen einige Anstrengungen unternehmen, um die Shader-Programmierung zu erlernen (XNA unterstützt HLSL). Dies ist jedoch möglicherweise einfacher als das Erlernen einer herstellerspezifischen Lösung wie der CUDA von nVidia. Der Vorteil ist, dass Sie in einer zu 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!


1
Grüße aus der Zukunft. Obwohl es zu dieser Zeit wohl eine gute Antwort war (ich habe mich ziemlich viel mit XNA beschäftigt), ist XNA leider nicht mehr vorhanden
MickyD

@ MickyD Großartiger Scott! Als ich in mein DeLorean sprang und bis 2018 reiste, vergaß ich völlig, diese Antwort zu aktualisieren! Wenn Sie immer noch an XNA interessiert sind, ist der spirituelle Nachfolger wahrscheinlich das plattformübergreifende MonoGame: monogame.net
Dave R.

Lol. Danke, ich werde das überprüfen
MickyD

9

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


2
Ich liebe die Idee, aber sie haben vor ungefähr zwei Jahren aufgehört, auf Fragen des technischen Supports zu antworten, und die Website ist seit ungefähr einem Jahr mehr oder weniger inaktiv, daher denke ich, dass das Projekt tot ist. Anscheinend ist der Autor jedoch auf SO .
BlueRaja - Danny Pflughoeft

Tidedpowerd stoppte die Entwicklung von GPU.NET und schloss das Geschäft.
Daniel

9

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.

GPU.Net scheint jedoch keinen Boilerplate-Code zu benötigen (laut Dokumentation wird es "automatisch vom Build-Tool injiziert") , während CUDAfy dies tut.


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


8

Nun, das ist eine ziemlich alte Frage, und seitdem sie gestellt 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 den Antworten 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 # -Seite ist Alea die erste Option für die Verwendung von F # in der GPGPU-Programmierung.
Um dieses Framework kennenzulernen, schlage ich vor, einen Blick auf die umfassende Liste der Beispiele zu werfen .


1
Habe gerade deine Antwort gesehen, werde meinen Beitrag löschen. Siehe auch Channel 9 Interview von Seth Juarez hier und SO Tag hier )
David Cuccia

@ DavidCuccia Großartige Arbeit beim Überprüfen Ihrer alten Antworten. Und auch danke für Kanal 9 Link (Dezember 2016!)
Rsh

Ich denke du meinst diese Channel 9 Aufnahme
Daniel

@ Daniel Ich meinte "Link zur Aufnahme von Kanal 9". War das mehrdeutig? Wie auch immer, danke für den Hinweis.
Rsh

@ DavidCuccia Entschuldigung für die Verwirrung, Link war schwer zu sehen
Daniel

7

Schauen Sie sich neben Brahma auch C $ an (ausgesprochen "C Bucks"). Von ihrer CodePlex- Site :

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

Es basiert auf C #, wird träge ausgewertet und zielt auf mehrere Beschleunigermodelle ab:

Derzeit umfasst die Liste der vorgesehenen Architekturen GPU, Multi-Core-CPU, Multi-GPU (SLI, CrossFire) und Multi-GPU + Multi-CPU-Hybridarchitektur.


7

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

Die Verwendung von C # erfolgt über P / Invoke, wie hier für Desktop-Apps und hier demonstriert für Metro-Apps (nicht anrufen) demonstriert.

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

Bearbeiten: Anscheinend befindet sich die Technologie jetzt im "Wartungsmodus", was bedeutet, dass sie Fehler behebt, sich aber nicht aktiv entwickelt.


2

Managed DirectX könnte irgendwie funktionieren


2
Grüße aus der Zukunft. Obwohl MDX zu dieser Zeit wohl eine gute Antwort war, ist MDX leider nicht mehr verfügbar, da es durch XNA ersetzt wurde, das ebenfalls nicht mehr funktioniert.
MickyD

2

Wenn Ihre GPUs alle von derselben Marke sind, können Sie möglicherweise GPGPU-Unterstützung vom Anbieter erhalten, entweder über Nvidias CUDA oder ATIs Stream. AFAIK bieten DLLs, die Sie über P / Invoke verwenden können.


1

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


0

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

Ich habe kürzlich ein Open-Source-Projekt von mir in dieses Github-Repository hochgeladen , das OpenCL verwendet.

Was es tut (Sie können es auch auf seiner Wiki-Seite überprüfen), ist, mehrere OpenCL-fähige Geräte und eine Kernel-Zeichenfolge vom Benutzer auszuwählen und C # - oder C ++ - Array-Wrapper zu erstellen, die dann mithilfe eines automatischen Load-Balancers und eines mit all berechnet werden Pipeliner (um Latenzen zu verbergen), um eine gute Effizienz des PCs zu erzielen.

Hier ist ein Beispiel für seine Verwendung (1024 Workitems, die auf alle Geräte verteilt sind und jeweils denselben 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, also zögern Sie nicht, ein "Problem" auf der Registerkarte "Github-Probleme" hinzuzufügen. Multi-PC-Cluster-relevante Klassen funktionieren nicht und sind noch nicht ins Englische übersetzt, können jedoch mindestens alle Geräte in einem einzigen PC verwenden.


-2

WPF verwendet auch die GPU und Sie können benutzerdefinierte Shader mit HLSL hinzufügen.


WPF hat meines Wissens keinen Zugriff auf die GP-GPU-Berechnung. Wenn es um WPF System.Windows.Media-Grafiken geht, handelt es sich nicht um echtes DirectX. Sehr langsam im Vergleich zur Vertex-Programmierung auf niedrigerer Ebene mit SharpDX oder SlimDX.
Pasi Tuomainen

Ich habe einen Link zu einer Reihe von Artikeln über GPU-beschleunigte benutzerdefinierte Effekte in WPF hinzugefügt.
Mark Cidade
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.