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?

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.


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.


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. :)


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!


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

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.


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 .


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.


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.


2

DirectX yang dikelola entah bagaimana, mungkin berhasil


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.


1

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


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.


-2

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.