GPU'yu c # ile kullanma [kapalı]


135

Şebekemden daha fazla işlem gücü elde etmeye çalışıyorum.

Tüm cpus / çekirdeklerini kullanıyorum, GPU'yu C # ile kullanmak mümkün mü?

Herkes herhangi bir kütüphane biliyor veya herhangi bir örnek kod var mı?

Yanıtlar:


156

[ Bu cevap bile oldukça eski olduğu için Ekim 2017'yi düzenleyin ]

Bu cevapların çoğu oldukça eski, bu yüzden her bir projenin nerede olduğunu düşündüğümün güncel bir özetini vereceğimi düşündüm:

  • GPU.Net (TidePowerd) - Bunu 6 ay önce denedim ve biraz çalışma gerektirse de işe başladım. C # çekirdek kodunu derleme zamanında cuda'ya dönüştürür. Ne yazık ki kendi web sitesi kapatıldı ve github birkaç yıldır güncellenmedi, bu projenin öldüğünü gösterebilir ....

  • Cudafy - Açık kaynak kodlu ve kullanımı çok kolay. C # çekirdek kodunu çalışma zamanında cuda'ya dönüştürür (serileştirme ve önbellekleme özelliği ile). CPU'da aynı çekirdek kodunu kolayca çalıştırabilir (çoğunlukla hata ayıklama için). Birden fazla GPU'yu destekler. Burada diğerlerinden daha fazla örnek. Diğer cevaplar tarafından atıfta bulunulan ortak kod en az düzeydedir ve benim durumumda en azından kodun nasıl çalıştığını anlamamda yardımcı oldu. Cuda / Nvidia sadece. Ne yazık ki, çözümlerini birkaç yıl boyunca güncellemedikleri görülüyor (2015'teki son taahhüt - cuda 7.0 desteği).

  • Hibridizatör . C # 'dan CUDA' ya derlenen ticari çözüm. Visual studio pazarında ücretsiz bir topluluk baskısı ve github'da örnekler sunar .

  • AleaGPU Tüketici GPUS'u için ücretsiz topluluk sürümüne sahip ticari çözüm. Ayrıntılar için Daniel'in yorumlarına bakın.

  • Brahma - LINQ ifadelerini OpenCL aracılığıyla çalıştırır (bu nedenle AMD'yi de destekler). Çok fazla belge / örnek yok. Son güncelleme 2011.

  • C $ - son gelişme 10 yıl önce oldu ...

  • Microsoft Accelerator - benzer şekilde artık aktif olarak geliştiriliyor gibi görünmüyor.

  • bazıları ( C ++ AMP , OpenTK - Ölü / Cloo ) - yani C # dan GPU aramaya izin yok, ama (aslında GPU üzerinde çalıştırılan code) çekirdek kodu ile yazılmış gerekiyor - bunların çoğunun sadece bağlamaları vardır C veya OpenCL, başka bir dili kullanmanız (ve öğrenmeniz) anlamına gelir.

Dediğim gibi Cudafy tüm diğerleri üzerinde tavsiye ederim - OpenCL yanı sıra Cuda üzerinde çalıştırmak mükemmel olurdu.

SEP 2013 EDIT Cudafy artık hem CUDA hem de OpenCL için derlemenize izin veriyor , bu nedenle tüm GPU'larda aynı C # kodunu çalıştıracak. OpenCL derlemesini henüz test etmeme rağmen bu harika görünüyor.


31
Hızlı gelişen bir konuda yararlı bir soruyu güncellemek için +1.
philologon

2
Alea GPU quantalea.com tüm .NET dilleri için CUDA desteği sağlar, tamamen çapraz platformdur ve .NET GPU kodunda hata ayıklama ve profil oluşturma ile en iyi geliştirici deneyimini sunar.
Daniel

Cudafy'daki OpenCL desteği oldukça kötü - projem büyüdüğünde bile derlemeyi başaramadım. Bu nedenle, düz OpenCL ile yapışıp C # 'a bağlamalar yapacağım.
Libor

Cudafy kullanarak OpenCL benim için iyi çalışıyor, yıllardır kullanıyor
mcmillab

Gelecekteki ziyaretçilere yardımcı olmak için projelere bağlantılar eklendi.
Dan Atkinson

46

Microsoft Research Accelerator bir .NET GP GPU kitaplığıydı.


Bu kötü lisanslama politikası olan harika bir projeydi. Ne yazık ki, artık MS sitesinde mevcut değil ...
ForNeVeR

25

Brahma buldum ... Aynı zamanda GPU üzerinde çalışan yöntemlere izin veren bir GPGPU sağlayıcısı var ... Soru için teşekkürler ... Bugün yeni bir şey öğrendim. :)


10

XNA Game Studio'yu keşif için olası bir yol olarak önerebilir miyim? Açıkçası oyun yazmak için hazırlanmıştır, ancak grafik kartınıza yönetilen erişim ve daha önce yönetilen DirectX'te mevcut olandan daha fazla kapasite numaralandırma işlevlerine ve gölgelendirici geliştirmeye daha iyi erişim sağlar. WinForms ve XNA'yı hibrit uygulamalarda birleştirmenin yolları da vardır:

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

Gölgelendirici programlamayı öğrenmek için biraz çaba harcamalısınız (XNA, HLSL'yi destekler), ancak bu, nVidia'nın CUDA gibi satıcıya özgü bir çözümü öğrenmekten daha basit bir yaklaşım olabilir. Avantajı% 100 yönetilen bir ortamda programlayabilmenizdir. İşte bazı HLSL bağlantıları:

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

GPGPU sitesi ayrıca genel amaçlı GPU programlama için önerilen bir hedeftir:

http://gpgpu.org/

İyi şanslar!


1
Gelecekten selamlar. O zaman tartışmasız iyi bir cevap olsa da (XNA ile biraz
dabbledim

@MickyD Büyük Scott! DeLorean'ımın içine girdiğimde ve 2018'e gittiğimde, bu yanıtı güncellemeyi tamamen unuttum! Hala XNA ile ilgileniyorsanız, manevi halef muhtemelen çapraz platform MonoGame: monogame.net
Dave R.

Lol. Teşekkürler Ben kontrol edeceğim
MickyD


9

İşte bir tane daha: CUDAfy . GPU.Net gibi geliyor, çünkü bir yöntem özniteliği kadar basit bir şey tüm yöntemin GPU'da çalışmasına neden olabilir. Ancak GPU.Net'in aksine, CUDAfy ücretsiz ve açık kaynaklıdır.

GPU.Net olsa hiçbir Demirbaş kodu gerektirdiği görülmektedir (kendi docs göre, "yap-araç tarafından otomatik olarak enjekte" oluyor) CUDAfy yapar iken,.


İşte CUDAfy ile bir uygulama oluşturmaya bir örnek.


8

Bu oldukça eski bir soru ve sorulduğu için işler çok değişti. Alea GPU'daki
yanıtlarda hiç kimsenin bahsetmediği GPU kodu yazmak için .Net'i kullanmak için başka bir seçenek . C #, F # ve VB'yi kapsar.

.NET ve Mono için profesyonel GPU yazılım geliştirme ortamı. Gerçekten çapraz platform

F # resmi sitesinde, Alea GPGPU programlamasında F # kullanmak için ilk seçenektir .
Bu çerçeveyi tanımak için kapsamlı örnek listesine bir göz atmanızı öneririm .


1
Sadece cevabınızı gördüm, yazımı silecek. Seth Juarez da Kanal 9 röportajda bakın burada ve SO etiketi burada )
David Cuccia

@DavidCuccia Eski cevaplarınızı kontrol etmek için harika bir iş. Ve ayrıca kanal 9 bağlantısı için teşekkürler (2016 Aralık!)
Rsh

Sanırım bu Kanal 9 kaydını
Daniel

@ Daniel "Kanal 9 kaydına bağlantı" demek istedim. Bu belirsiz miydi? Her neyse, işaret ettiğin için teşekkürler.
Rsh

@DavidCuccia karışıklık için özür dilerim, bağlantı görmek zordu
Daniel

7

Brahma'ya ek olarak, C $ ' a göz atın ("C Bucks" olarak telaffuz edilir). CodePlex sitelerinden :

[C $] 'ın amacı, modern GPU'lar ve CPU'larda kesintisiz paralel programlama için birleşik bir dil ve sistem oluşturmaktır.

Tembel olarak değerlendirilen C # tabanlıdır ve çoklu hızlandırıcı modellerini hedefler:

Şu anda amaçlanan mimarilerin listesi GPU, Çok çekirdekli CPU, Çok GPU (SLI, CrossFire) ve Çok GPU + Çok CPU Hibrit Mimarisini içermektedir.


7

Şehirde yeni bir Microsoft çözümü var - C ++ AMP ( buraya giriş ).

Masaüstü uygulamaları için burada ve (çağırmayın) Metro uygulamaları için burada gösterildiği gibi C # ile kullanım P / Invoke aracılığıyla olacaktır .

Düzenleme: C ++ AMP, mutlaka MS derleyici için veya sadece Windows için değil anlamına gelir açık bir belirtime sahip olduğunu not etmeliyim .

Düzenleme: Görünüşe göre, teknoloji şimdi "bakım modunda", yani onlar hataları düzeltmek, ama aktif olarak gelişmekte değil demektir.


2

Yönetilen DirectX bir şekilde işe yarayabilir


2
Gelecekten selamlar. O zaman tartışmasız iyi bir cevap olsa da, ne yazık ki MDX artık yerine geçersiz olan XNA ile değiştirildi.
MickyD

2

GPU'larınız tamamen aynı markadaysa, Nvidia'nın CUDA veya ATI's Stream aracılığıyla satıcıdan GPGPU desteği alabilirsiniz. AFAIK, P / Invoke aracılığıyla kullanabileceğiniz DLL dosyaları sağlarlar.


1

CenterSpace Software, NMath kütüphanelerinde C # projesine ekleyebileceğiniz GPU destekli hesaplamaya sahiptir . Ticari bir üründür.


0

Özel çekirdeklere ihtiyaç duyan kendi algoritmalarınızı uygulayacaksanız:

Kısa süre önce bu github deposuna açık kaynaklı bir proje yükledim OpenCL kullanan .

Yaptığı şey (wiki sayfasından da kontrol edebilirsiniz), birden fazla OpenCL özellikli cihaz ve kullanıcıdan bir çekirdek dizesi seçmek ve C # veya C ++ dizi sarmalayıcıları oluşturmak ve otomatik yük dengeleyici ve pc dışında iyi verimlilik elde etmek için pipeliner (gecikmeleri gizlemek için).

Kullanımının bir örneği (her biri aynı kodu çalıştıran ancak farklı veri ve threadId kullanan tüm cihazlara bölünmüş 1024 iş öğesi):

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

hepsi artık kullanılmadığında, tüm C ++ kaynaklarını yıkıcılarıyla birlikte serbest bırakırlar.

Ama bu olgun değil, bu yüzden github sorunları sekmesine herhangi bir "sorun" eklemek için çekinmeyin. Çoklu pc-küme ile ilgili sınıflar çalışmıyor ve henüz İngilizce'ye çevrilmiyor, ancak en azından tek bir bilgisayardaki tüm cihazları kullanabilir.


-2

WPF ayrıca GPU kullanır ve HLSL kullanarak özel gölgelendiriciler ekleyebilirsiniz.


WPF'nin bildiklerime göre GP GPU hesaplama erişimi yok. WPF System.Windows.Media grafikleri hakkında konuşurken, gerçek DirectX değildir. SharpDX veya SlimDX ile alt seviye köşe programlamaya kıyasla çok yavaş.
Pasi Tuomainen

WPF'deki GPU hızlandırmalı özel efektlerle ilgili bir dizi makaleye bağlantı ekledim.
Mark Cidade
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.