Wykorzystanie GPU z C # [zamknięte]

135

Próbuję uzyskać więcej mocy obliczeniowej z mojej sieci.

Używam wszystkich procesorów / rdzeni, czy jest możliwe użycie GPU z C #.

Czy ktoś zna jakieś biblioteki lub ma przykładowy kod?

Mark Cidade
źródło

Odpowiedzi:

156

[ Edytuj październik 2017 r., Ponieważ nawet ta odpowiedź staje się dość stara ]

Większość z tych odpowiedzi jest dość stara, więc pomyślałem, że podam zaktualizowane podsumowanie tego, gdzie moim zdaniem znajduje się każdy projekt:

  • GPU.Net (TidePowerd) - próbowałem tego około 6 miesięcy temu i sprawiłem, że zadziałało, chociaż wymagało to trochę pracy. Konwertuje kod jądra C # na cuda w czasie kompilacji. Niestety ich strona internetowa nie działa, a ich github nie był aktualizowany od kilku lat, co może wskazywać, że projekt jest martwy ....

  • Cudafy - Open source i bardzo łatwy w użyciu. Konwertuje kod jądra C # na cuda w czasie wykonywania (z możliwością serializacji i buforowania). Może łatwo uruchomić ten sam kod jądra na procesorze (głównie do debugowania). Obsługuje wiele procesorów graficznych. Więcej dostępnych przykładów niż inne tutaj. Standardowy kod, do którego odnoszą się inne odpowiedzi, jest minimalny iw moim przypadku przynajmniej pomógł mi w zrozumieniu, jak działa kod. Jednak tylko Cuda / Nvidia. Niestety wygląda na to, że przez kilka lat nie aktualizowali swoich rozwiązań (ostatnie zatwierdzenie w 2015 r. - wsparcie CUDA 7.0).

  • Hybrydyzator . Komercyjne rozwiązanie kompilujące C # do CUDA. Zapewnia bezpłatną edycję społecznościową na rynku Visual Studio i próbki na github .

  • AleaGPU Rozwiązanie komercyjne z bezpłatną edycją społecznościową dla konsumenckich GPUS. Zobacz komentarze Daniela po szczegóły.

  • Brahma - uruchamia wyrażenia LINQ przez OpenCL (więc obsługuje również AMD). Niewiele dokumentacji / przykładów. Ostatnia aktualizacja w 2011 r.

  • C $ - ostatni rozwój miał miejsce ponad 10 lat temu ...

  • Microsoft Accelerator - podobnie nie wygląda na to, że jest już aktywnie rozwijany.

  • niektóre inne ( C ++ AMP , OpenTK - dead / Cloo ) - wiele z nich to tylko powiązania - tj. umożliwiają wywołanie GPU z C #, ale kod jądra (kod, który jest faktycznie uruchamiany na GPU) musi być napisany w C lub OpenCL, co oznacza, że ​​musisz używać (i uczyć się) innego języka.

Jak powiedziałem, poleciłbym Cudafy ponad wszystkimi innymi - gdyby mógł działać zarówno na OpenCL, jak i Cuda, byłby idealny.

EDYCJA WRZ 2013 Cudafy umożliwia teraz kompilację zarówno dla CUDA, jak i OpenCL, więc będzie uruchamiać ten sam kod C # na wszystkich procesorach graficznych. Brzmi fantastycznie, chociaż nie testowałem jeszcze kompilacji OpenCL.

mcmillab
źródło
31
+1 za zaktualizowanie przydatnego pytania w rodzaju szybko rozwijającego się tematu.
filologon
2
Alea GPU quantalea.com zapewnia obsługę CUDA dla wszystkich języków .NET, jest w pełni wieloplatformowa i zapewnia najlepsze wrażenia programistom w zakresie debugowania i profilowania kodu GPU .NET.
Daniel
Obsługa OpenCL w Cudafy jest dość zła - nigdy nie udało mi się nawet skompilować, gdy mój projekt urósł. Dlatego będę trzymać się zwykłego OpenCL i tworzyć powiązania z C #.
Libor
OpenCL używający Cudafy działa dobrze dla mnie, używam go od lat
mcmillab
Dodano łącza do projektów, aby pomóc przyszłym odwiedzającym.
Dan Atkinson,
46

Microsoft Research Accelerator to biblioteka GPU .NET.

Mark Cidade
źródło
To był świetny projekt ze złą polityką licencyjną. Niestety nie jest już dostępny na stronie MS ...
ForNeVeR
25

Znalazłem Brahmę ... Ma również dostawcę GPGPU, który pozwala metodom działać na GPU ... Dzięki za pytanie ... Nauczyłem się dziś czegoś nowego. :)

Vyas Bharghava
źródło
10

Czy mógłbym polecić XNA Game Studio jako możliwą drogę do eksploracji? Jest oczywiście przystosowany do pisania gier, ale zapewnia zarządzany dostęp do karty graficznej i znacznie lepszy dostęp do funkcji wyliczania możliwości i rozwoju shaderów, niż było to wcześniej dostępne w, powiedzmy, Managed DirectX. Istnieją również sposoby łączenia WinForm i XNA w aplikacje hybrydowe:

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

Będziesz musiał włożyć trochę wysiłku w naukę programowania shaderów (XNA obsługuje HLSL), ale może to być prostsze podejście niż nauka rozwiązania specyficznego dla dostawcy, takiego jak CUDA firmy nVidia. Zaletą jest to, że możesz programować w 100% zarządzanym środowisku. Oto kilka linków HLSL:

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

Witryna GPGPU jest również zalecanym miejscem docelowym do programowania GPU ogólnego przeznaczenia:

http://gpgpu.org/

Powodzenia!

Dave R.
źródło
1
Pozdrowienia z przyszłości. Chociaż prawdopodobnie dobra odpowiedź w tamtym czasie (parałem się XNA całkiem sporo), niestety XNA już nie istnieje
MickyD
@MickyD Great Scott! Kiedy wskoczyłem do mojego DeLoreana i udałem się do 2018 roku, całkowicie zapomniałem zaktualizować tę odpowiedź! Jeśli nadal interesuje Cię XNA, duchowym następcą jest prawdopodobnie wieloplatformowa MonoGame: monogame.net
Dave R.
Lol. Dzięki, sprawdzę to
MickyD
9

A co z http://www.tidepowerd.com/ GPU.NET?

pointernil
źródło
2
Podoba mi się ten pomysł, ale przestali odpowiadać na pytania wsparcia technicznego około dwa lata temu, a strona była mniej więcej niedostępna od około roku, więc myślę, że projekt jest martwy. Najwyraźniej jednak autor jest na SO .
BlueRaja - Danny Pflughoeft
Tidedpowerd zatrzymał rozwój GPU.NET i zamknął biznes.
Daniel,
9

Oto kolejny: CUDAfy . Brzmi jak GPU.Net, ponieważ coś tak prostego jak atrybut-metoda może spowodować, że cała metoda zostanie uruchomiona na GPU. Ale w przeciwieństwie do GPU.Net, CUDAfy jest darmowy i open-source.

Wygląda na to, że GPU.Net nie wymaga żadnego standardowego kodu (według ich dokumentacji jest on „wprowadzany automatycznie przez narzędzie do kompilacji”) , podczas gdy CUDAfy tak.


Oto przykład budowania aplikacji za pomocą CUDAfy.

BlueRaja - Danny Pflughoeft
źródło
8

Cóż, to dość stare pytanie, a odkąd je zadano, wiele się zmieniło.
Inna opcja wykorzystania .Net do pisania kodu GPU, o której nikt nie wspomniał w odpowiedziach w GPU Alea . Obejmuje C #, F # i VB.

Profesjonalne środowisko programistyczne dla GPU dla .NET i Mono. Naprawdę wieloplatformowe

W oficjalnej witrynie F # Alea jest pierwszą opcją używania F # w programowaniu GPGPU.
Aby zapoznać się z tym frameworkiem, proponuję spojrzeć na obszerną listę przykładów .

Rsh
źródło
1
Właśnie zobaczyłem twoją odpowiedź, usunie mój post. Zobacz także wywiad Setha Juareza dla Channel 9 tutaj i tag SO tutaj )
David Cuccia,
@DavidCuccia Świetna robota przy sprawdzaniu starych odpowiedzi. A także dzięki za link do kanału 9 (grudzień 2016!)
Rsh
Myślę, że masz na myśli to nagranie Channel 9
Daniel
@Daniel Miałem na myśli „link do nagrania kanału 9”. Czy to było niejednoznaczne? W każdym razie dziękuję za wskazanie.
Rsh
@DavidCuccia przepraszam za zamieszanie, link był trudny do zauważenia
Daniel
7

Oprócz Brahmy spójrz na C $ (wymawiane „C Bucks”). Z ich witryny CodePlex :

Celem [C $] jest stworzenie ujednoliconego języka i systemu do płynnego programowania równoległego na nowoczesnych GPU i CPU.

Jest oparty na C #, oceniany leniwie i jest przeznaczony dla wielu modeli akceleratorów:

Obecnie lista planowanych architektur obejmuje GPU, wielordzeniowy procesor, Multi-GPU (SLI, CrossFire) i Wieloprocesorową Wieloprocesorową Architekturę Hybrydową.

David Cuccia
źródło
7

W mieście pojawiło się nowe rozwiązanie Microsoftu - C ++ AMP (intro tutaj ).

Używaj z C # przez P / Invoke, jak pokazano tutaj dla aplikacji klasycznych i tutaj dla aplikacji Metro (nie nazywaj tego).

Edycja: Powinienem zauważyć, że C ++ AMP ma otwartą specyfikację , co oznacza, że ​​niekoniecznie jest przeznaczony tylko dla kompilatora MS lub tylko dla systemu Windows.

Edycja: Najwyraźniej technologia jest teraz w „trybie konserwacji”, co oznacza, że ​​naprawiają błędy, ale nie są aktywnie rozwijani.

David Cuccia
źródło
2

Jakoś zarządzany DirectX może działać

Greg Dean
źródło
2
Pozdrowienia z przyszłości. Chociaż prawdopodobnie była to dobra odpowiedź w tamtym czasie, niestety MDX jest obecnie zlikwidowany, ponieważ został zastąpiony XNA, który również nie istnieje.
MickyD
2

Jeśli wszystkie Twoje procesory graficzne są tej samej marki, możesz uzyskać wsparcie GPGPU od dostawcy, za pośrednictwem CUDA firmy Nvidia lub Stream ATI. AFAIK, zapewniają biblioteki DLL, których można używać za pośrednictwem P / Invoke.

Coderer
źródło
1

Oprogramowanie CenterSpace ma w swoich bibliotekach NMath obliczenia oparte na GPU, które można dodać do projektu C #. To produkt komercyjny.

Pasi Tuomainen
źródło
0

Jeśli zamierzasz zastosować własne algorytmy, które wymagają niestandardowych jąder:

Niedawno przesłałem swój projekt open source do tego repozytorium github, które korzysta z OpenCL.

To, co robi (możesz to również sprawdzić na jego stronie wiki), polega na wybraniu wielu urządzeń obsługujących OpenCL i ciągu jądra od użytkownika i utworzeniu opakowań tablic w C # lub C ++, a następnie obliczeniu przy użyciu wszystkiego, z pomocą automatycznego równoważenia obciążenia i pipeliner (aby ukryć opóźnienia), aby uzyskać dobrą wydajność z komputera.

Oto przykład jego użycia (1024 elementy robocze podzielone na wszystkie urządzenia, z których każdy ma ten sam kod, ale używa innych danych i ThreadId):

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

kiedy wszystkie nie są już używane, zwalniają wszystkie zasoby C ++ ze swoimi destruktorami.

Ale to nie jest aż tak dojrzałe, więc nie krępuj się dodawać "problemów" na karcie problemów na githubie. Klasy związane z wieloma komputerami PC nie działają i nie są jeszcze przetłumaczone na angielski, ale mogą używać wszystkich urządzeń przynajmniej na jednym komputerze.

huseyin tugrul buyukisik
źródło
-2

WPF również korzysta z procesora GPU i można dodawać niestandardowe programy do cieniowania za pomocą HLSL.

Mark Cidade
źródło
O ile wiem, WPF nie ma dostępu do obliczeń GPU. Mówiąc o grafice WPF System.Windows.Media, nie jest to prawdziwy DirectX. Bardzo wolno w porównaniu do programowania wierzchołków niższego poziomu za pomocą SharpDX lub SlimDX.
Pasi Tuomainen
Dodałem łącze do serii artykułów na temat niestandardowych efektów przyspieszanych przez GPU w WPF.
Mark Cidade