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?
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:
[ 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.
Microsoft Research Accelerator war eine .NET GP-GPU-Bibliothek.
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. :) :)
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:
Viel Glück!
Wie wäre es mit http://www.tidepowerd.com/ GPU.NET?
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.
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 .
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.
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.
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.
WPF verwendet auch die GPU und Sie können benutzerdefinierte Shader mit HLSL hinzufügen.