Memanfaatkan GPU dengan c # [closed]

136

Saya mencoba untuk mendapatkan lebih banyak kekuatan pemrosesan dari jaringan saya.

Saya menggunakan semua cpus / core, apakah mungkin menggunakan GPU dengan C #.

Adakah yang tahu perpustakaan atau punya kode sampel?

Mark Cidade
sumber

Jawaban:

160

[ Edit OCT 2017 karena jawaban ini sudah cukup lama ]

Sebagian besar jawaban ini cukup lama, jadi saya pikir saya akan memberikan ringkasan terbaru tentang di mana menurut saya setiap proyek:

  • GPU.Net (TidePowerd) - Saya mencoba ini 6 bulan yang lalu atau lebih, dan berhasil melakukannya meskipun butuh sedikit kerja. Mengubah kode kernel C # menjadi cuda pada waktu kompilasi. Sayangnya situs web mereka tidak aktif dan github mereka belum diperbarui selama beberapa tahun, yang mungkin menunjukkan bahwa proyek tersebut sudah mati ....

  • Cudafy - Open source dan sangat mudah digunakan. Mengonversi kode kernel C # menjadi cuda saat runtime (dengan kemampuan untuk membuat serial dan cache). Dapat dengan mudah menjalankan kode kernel yang sama pada CPU (kebanyakan untuk debugging). Mendukung banyak GPU. Lebih banyak contoh tersedia daripada yang lain di sini. Kode boilerplate yang dirujuk oleh jawaban lain minimal, dan dalam kasus saya setidaknya membantu pemahaman saya tentang cara kerja kode. Cuda / Nvidia saja. Sayangnya, tampaknya mereka juga tidak memperbarui solusi mereka selama beberapa tahun (komit terbaru pada tahun 2015 - dukungan cuda 7.0).

  • Hibridizer . Solusi komersial yang menyusun C # ke CUDA. Menyediakan edisi komunitas gratis di pasar studio visual dan sampel di github .

  • Solusi AleaGPU Komersial dengan edisi komunitas gratis untuk GPUS konsumen. Lihat komentar Daniel untuk detailnya.

  • Brahma - menjalankan ekspresi LINQ melalui OpenCL (sehingga mendukung AMD juga). Tidak banyak dokumentasi / contoh. Pembaruan terakhir pada tahun 2011.

  • C $ - pengembangan terakhir lebih dari 10 tahun yang lalu ...

  • Microsoft Accelerator - juga tidak terlihat seperti sedang dikembangkan secara aktif lagi.

  • beberapa lainnya ( C ++ AMP , OpenTK - dead / Cloo ) - banyak di antaranya hanya binding - yaitu memungkinkan Anda memanggil GPU dari C #, tetapi kode kernel Anda (kode yang sebenarnya dijalankan di GPU) perlu ditulis di C atau OpenCL, artinya Anda harus menggunakan (dan mempelajari) bahasa lain.

Seperti yang saya katakan, saya akan merekomendasikan Cudafy daripada yang lain - jika itu bisa berjalan di OpenCL dan juga Cuda, itu akan sempurna.

EDIT September 2013 Cudafy sekarang memungkinkan Anda untuk mengkompilasi untuk kedua CUDA dan OpenCL, sehingga akan berjalan C # sama kode pada semua GPU. Kedengarannya fantastis, meskipun saya belum menguji kompilasi OpenCL.

mcmillab.dll
sumber
33
+1 untuk memperbarui pertanyaan yang berguna dalam topik yang berkembang pesat.
philologon
2
Alea GPU quantalea.com menyediakan dukungan CUDA untuk semua bahasa .NET, sepenuhnya lintas platform dan memberikan pengalaman pengembang terbaik dengan debugging dan pembuatan profil kode GPU .NET.
Daniel
Dukungan OpenCL di Cudafy sangat buruk - saya tidak pernah berhasil mengkompilasi bahkan ketika proyek saya tumbuh lebih besar. Oleh karena itu saya akan tetap menggunakan OpenCL biasa dan membuat binding ke C #.
Libor
OpenCL menggunakan Cudafy bekerja dengan baik untuk saya, telah menggunakannya selama bertahun-tahun sekarang
mcmillab
1
ILGPU ( ilgpu.net ): Kompiler GPU modern, ringan & cepat untuk program .Net berkinerja tinggi. Gratis! ILGPU dirilis di bawah Lisensi Sumber Terbuka Universitas Illinois / NCSA. ILGPU adalah proyek gratis dan tidak disponsori. Ini sedang dikembangkan oleh kompiler profesional dan bersemangat, GPU dan pengembang grafis komputer. Dukung proyek dengan kontribusi atau sumbangan kecil untuk mempercepat proses pengembangan dan menjaga proyek tetap berjalan.
DanOver
46

Microsoft Research Accelerator adalah pustaka GPU GP .NET.

Mark Cidade
sumber
Itu adalah proyek hebat dengan kebijakan perizinan yang buruk. Sayangnya, tidak lagi tersedia di situs MS ...
ForNeVeR
25

Saya menemukan Brahma ... Ia juga memiliki penyedia GPGPU yang memungkinkan metode untuk dijalankan pada GPU ... Terima kasih atas pertanyaannya ... Mempelajari sesuatu yang baru hari ini. :)

Vyas Bharghava
sumber
10

Bisakah saya merekomendasikan XNA Game Studio sebagai jalan yang memungkinkan untuk eksplorasi? Ini jelas disiapkan untuk menulis permainan, tetapi memberi Anda akses terkelola ke kartu grafis Anda dan akses yang jauh lebih baik ke fungsi enumerasi kemampuan dan pengembangan shader daripada yang sebelumnya tersedia di, katakanlah, Managed DirectX. Ada juga cara untuk menggabungkan WinForms dan XNA ke dalam aplikasi hybrid:

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

Anda harus berusaha mempelajari pemrograman shader (XNA mendukung HLSL), tetapi ini mungkin pendekatan yang lebih sederhana daripada mempelajari solusi khusus vendor seperti CUDA nVidia. Keuntungannya adalah Anda dapat memprogram dalam lingkungan yang 100% terkelola. Berikut beberapa tautan HLSL:

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

Situs GPGPU juga merupakan tujuan yang disarankan untuk pemrograman GPU tujuan umum:

http://gpgpu.org/

Semoga berhasil!

Dave R.
sumber
1
Salam dari masa depan. Meskipun bisa dibilang jawaban yang bagus pada saat itu (saya mencoba-coba dengan XNA sedikit), sayangnya XNA sekarang sudah tidak berfungsi
MickyD
@ Scott Hebat @ickyD! Ketika saya melompat ke DeLorean saya dan melakukan perjalanan ke depan ke 2018, saya benar-benar lupa memperbarui jawaban ini! Jika Anda masih tertarik pada XNA, penerus spiritualnya mungkin adalah MonoGame lintas platform: monogame.net
Dave R.
Lol. Terima kasih, saya akan memeriksanya
MickyD
9

Bagaimana dengan http://www.tidepowerd.com/ GPU.NET?

pointernil
sumber
2
Saya suka idenya, tetapi mereka berhenti menanggapi pertanyaan dukungan teknis sekitar dua tahun lalu, dan situs tersebut kurang lebih telah turun selama sekitar satu tahun, jadi menurut saya proyek tersebut sudah mati. Rupanya penulisnya ada di SO .
BlueRaja - Danny Pflughoeft
Tidedpowerd menghentikan pengembangan GPU.NET dan menutup bisnis mereka.
Daniel
9

Ini satu lagi: CUDAfy . Kedengarannya seperti GPU.Net, karena sesuatu yang sederhana seperti atribut-metode dapat menyebabkan seluruh metode berjalan di GPU. Tetapi tidak seperti GPU.Net, CUDAfy gratis dan open-source.

GPU.Net tampaknya tidak memerlukan kode boilerplate, meskipun (Menurut dokumen mereka, itu "disuntikkan secara otomatis oleh build-tool") , sementara CUDAfy membutuhkannya.


Berikut adalah contoh membangun aplikasi dengan CUDAfy.

BlueRaja - Danny Pflughoeft
sumber
8

Ini adalah pertanyaan yang cukup lama, dan sejak ditanyakan banyak hal telah berubah banyak.
Opsi lain untuk menggunakan .Net untuk menulis kode GPU, yang belum disebutkan oleh siapa pun dalam jawaban di Alea GPU . Ini mencakup C #, F # dan VB.

Lingkungan pengembangan perangkat lunak GPU profesional untuk .NET dan Mono. Benar-benar lintas platform

Di situs resmi F #, Alea adalah opsi pertama untuk menggunakan F # dalam pemrograman GPGPU.
Untuk mengetahui kerangka kerja ini, saya sarankan untuk melihat daftar contoh lengkapnya .

Rsh
sumber
1
Baru saja melihat jawaban Anda, posting saya akan dihapus. Lihat juga wawancara Channel 9 oleh Seth Juarez di sini dan tag SO di sini )
David Cuccia
@DavidCuccia Selamat, Anda telah memeriksa jawaban lama Anda. Dan juga terima kasih untuk tautan saluran 9 (Des 2016!)
Rsh
Saya pikir yang Anda maksud adalah rekaman Channel 9 ini
Daniel
@ Daniel yang saya maksud adalah "tautan ke rekaman saluran 9". Apakah itu ambigu? Bagaimanapun, terima kasih sudah menunjukkannya.
Rsh
@DavidCuccia maaf atas kebingungannya, tautannya sulit dilihat
Daniel
7

Selain Brahma, lihat C $ (dibaca "C Bucks"). Dari situs CodePlex mereka :

Tujuan dari [C $] adalah menciptakan bahasa dan sistem terpadu untuk pemrograman paralel yang mulus pada GPU dan CPU modern.

Ini didasarkan pada C #, dievaluasi dengan malas, dan menargetkan beberapa model akselerator:

Saat ini daftar arsitektur yang dimaksud mencakup GPU, Multi-core CPU, Multi-GPU (SLI, CrossFire), dan Multi-GPU + Multi-CPU Hybrid Architecture.

David Cuccia
sumber
7

Ada solusi Microsoft baru di kota - C ++ AMP (intro di sini ).

Penggunaan dari C # akan melalui P / Invoke, seperti yang didemonstrasikan di sini untuk aplikasi desktop, dan di sini untuk aplikasi Metro (jangan ditelepon).

Sunting: Perlu saya perhatikan bahwa C ++ AMP memiliki spesifikasi terbuka , yang berarti tidak harus hanya untuk kompiler MS, atau hanya untuk Windows.

Sunting: Rupanya, teknologi sekarang dalam "mode pemeliharaan," yang berarti mereka memperbaiki bug, tetapi tidak berkembang secara aktif.

David Cuccia
sumber
2

DirectX yang dikelola entah bagaimana, mungkin berhasil

Greg Dean
sumber
2
Salam dari masa depan. Meskipun bisa dibilang jawaban yang bagus pada saat itu, sayangnya MDX sekarang sudah tidak berfungsi karena diganti dengan XNA yang juga tidak berfungsi.
MickyD
2

Jika semua GPU Anda adalah merek yang sama, Anda mungkin bisa mendapatkan dukungan GPGPU dari vendor, baik melalui Nvidia's CUDA atau ATI's Stream. AFAIK, mereka menyediakan DLL, yang dapat Anda gunakan melalui P / Invoke.

Pembuat kode
sumber
1

CenterSpace Software memiliki komputasi bertenaga GPU di perpustakaan NMath mereka, Anda dapat menambahkan proyek C #. Ini produk komersial.

Pasi Tuomainen
sumber
0

Jika Anda akan menerapkan algoritma Anda sendiri yang membutuhkan kernel khusus:

Saya baru-baru ini mengunggah proyek open-source saya ke repositori github ini yang menggunakan OpenCL.

Apa yang dilakukannya (Anda dapat memeriksa dari halaman wiki-nya juga) adalah, memilih beberapa perangkat yang mendukung OpenCL dan string kernel dari pengguna dan membuat pembungkus array C # atau C ++ kemudian menghitung menggunakan semua, dengan bantuan penyeimbang beban otomatis dan pipeliner (untuk menyembunyikan latensi) untuk mendapatkan efisiensi yang baik dari pc.

Berikut adalah contoh penggunaannya (1024 workitems dipartisi ke semua perangkat, masing-masing menjalankan kode yang sama tetapi menggunakan data dan threadId yang berbeda):

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

ketika semua tidak digunakan lagi, mereka melepaskan semua sumber daya C ++ dengan penghancurnya.

Tapi itu tidak terlalu dewasa, jadi silakan tambahkan "masalah" apa pun di tab masalah github. Kelas relevan multi-pc-cluster tidak berfungsi dan belum diterjemahkan ke bahasa Inggris tetapi setidaknya dapat menggunakan semua perangkat di satu pc.

huseyin tugrul buyukisik
sumber
-2

WPF juga menggunakan GPU dan Anda dapat menambahkan shader kustom menggunakan HLSL.

Mark Cidade
sumber
Sepengetahuan saya, WPF tidak memiliki akses komputasi GPU GP. Ketika berbicara tentang grafik WPF System.Windows.Media, itu bukan DirectX nyata. Sangat lambat jika dibandingkan dengan pemrograman vertex level rendah dengan SharpDX atau SlimDX.
Pasi Tuomainen
Saya menambahkan tautan ke serangkaian artikel tentang efek kustom yang dipercepat GPU di WPF.
Mark Cidade