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?
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?
Odpowiedzi:
[ 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.
Microsoft Research Accelerator to biblioteka GPU .NET.
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. :)
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:
Powodzenia!
A co z http://www.tidepowerd.com/ GPU.NET?
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.
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 .
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ą.
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.
Oprogramowanie CenterSpace ma w swoich bibliotekach NMath obliczenia oparte na GPU, które można dodać do projektu C #. To produkt komercyjny.
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.
WPF również korzysta z procesora GPU i można dodawać niestandardowe programy do cieniowania za pomocą HLSL.