Використання GPU c # [закрито]


135

Я намагаюся отримати більше процесорних потужностей з моєї сітки.

Я використовую всі процесори / ядра, чи можна використовувати графічний процесор за допомогою C #.

Хтось знає будь-які бібліотеки чи отримав зразок коду?

Відповіді:


156

[ Редагувати OCT 2017, оскільки навіть ця відповідь стає досить старою ]

Більшість із цих відповідей досить старі, тому я подумав, що я б оновлював резюме того, де я думаю, що кожен проект:

  • GPU.Net (TidePowerd) - я спробував це 6 місяців тому чи так, і він налагодив свою роботу, хоча це зайняло трохи роботи. Перетворює код ядра C # в cuda під час компіляції. На жаль, їх веб-сайт не працює, а їх github не оновлювався протягом кількох років, що може означати, що проект мертвий ....

  • Cudafy - з відкритим кодом та дуже простий у використанні. Перетворює код ядра C # в cuda під час виконання (з можливістю серіалізації та кешування). Можна легко запустити один і той же код ядра в процесорі (в основному для налагодження). Підтримується кілька графічних процесорів. Тут доступні більше прикладів, ніж інші. Код котла, на який посилаються інші відповіді, мінімальний, і, в моєму випадку, принаймні допоміг мені зрозуміти, як працює код. Тільки Куда / Нвідія. На жаль, схоже, що вони не оновлювали свої рішення також пару років (остання фіксація у 2015 році - підтримка cuda 7.0).

  • Гібридизатор . Комерційне рішення, що компілює C # на CUDA. Надає безкоштовне видання для спільноти на ринку візуальної студії та зразки на github .

  • Комерційне рішення AleaGPU з безкоштовним виданням для споживачів GPUS. Деталі див. У коментарях Даніеля.

  • Brahma - запускає вирази LINQ через OpenCL (тому підтримує також AMD). Не так багато документації / прикладів. Останнє оновлення в 2011 році.

  • C $ - остання розробка була понад 10 років тому ...

  • Microsoft Accelerator - подібне схоже, він більше не активно розробляється.

  • деякі інші ( C ++ AMP , OpenTK - мертвий / Cloo ) - багато з них є лише прив'язкою - тобто дозволяють викликати GPU з C #, але ваш код ядра (код, який насправді запускається на GPU) повинен бути записаний у C або OpenCL, тобто ви повинні використовувати (і вивчати) іншу мову.

Як я вже сказав, я б рекомендував Cudafy над усіма іншими - якби він міг працювати як на OpenCL, так і на Cuda, це було б ідеально.

EDIT SEP 2013 Cudafy тепер дозволяє компілювати як для CUDA, так і для OpenCL, тому буде запускатися однаковий код C # на всіх графічних процесорах. Це звучить фантастично, хоча я ще не перевіряв компіляцію OpenCL.


31
+1 для оновлення корисного питання в темі, що швидко розвивається.
філолог

2
Alea GPU quantalea.com надає підтримку CUDA для всіх .NET мов, є повністю крос-платформою та дає найкращий досвід розробникам при налагодженні та профілюванні .NET GPU-коду.
Даніель

Підтримка OpenCL в Cudafy є досить поганою - мені ніколи не вдалося навіть скласти, коли мій проект зростав більше. Отже, я буду дотримуватися звичайного OpenCL і робити прив’язки до C #.
Libor

OpenCL за допомогою Cudafy працює для мене чудово, використовую його вже роками
mcmillab

Додано посилання на проекти, які допоможуть майбутнім відвідувачам.
Ден Аткінсон

46

Microsoft Research Accelerator була бібліотекою GPU .NET GP.


Це був чудовий проект із поганою ліцензійною політикою. На жаль, більше немає на сайті MS ...
ForNeVeR

25

Я знайшов Brahma ... Тут також є постачальник GPGPU, який дозволяє запускати методи на GPU ... Дякую за запитання ... Сьогодні дізнався щось нове. :)


10

Чи можу я порекомендувати XNA Game Studio як можливий шлях для вивчення? Він, очевидно, орієнтований на написання ігор, але надає вам керований доступ до вашої відеокарти та набагато кращий доступ до функцій перерахування можливостей та розробки шейдерів, ніж раніше, наприклад, в Direct DirectX. Існують також способи комбінування WinForms та XNA в гібридних програмах:

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

Вам доведеться докласти певних зусиль для вивчення шейдерного програмування (XNA підтримує HLSL), але це може бути простішим підходом, ніж вивчення конкретного рішення для постачальника, такого як CUDA nVidia. Перевага полягає в тому, що ви можете програмувати в 100% керованому середовищі. Ось кілька посилань HLSL:

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

Сайт GPGPU також є рекомендованим пунктом призначення для програмування GPU загального призначення:

http://gpgpu.org/

Удачі!


1
Привітання з майбутнього. Незважаючи на те, що на той час була чудова відповідь (я дуже посперечався з XNA), на жаль, XNA зараз не існує
MickyD

@MickyD Великий Скотт! Коли я стрибнув у свій DeLorean і поїхав вперед до 2018 року, я зовсім забув оновити цю відповідь! Якщо вас все ще цікавить XNA, духовним спадкоємцем, мабуть, є кросплатформна MonoGame: monogame.net
Дейв Р.

Лол. Дякую, я перевірю це
MickyD

9

Як щодо http://www.tidepowerd.com/ GPU.NET?


2
Мені подобається ця ідея, але вони перестали відповідати на питання технічної підтримки близько двох років тому, і сайт вже більше-менш зменшується близько року, тому я думаю, що проект мертвий. Мабуть, автор є на SO , хоча.
BlueRaja - Danny Pflughoeft

Tidedpowerd зупинив розвиток GPU.NET і закрив свій бізнес.
Даніель

9

Ось ще один: CUDAfy . Це виглядає як GPU.Net, оскільки щось таке просте, як метод-атрибут може спричинити запуск всього методу на GPU. Але на відміну від GPU.Net, CUDAfy є безкоштовним та відкритим.

Схоже, GPU.Net не вимагає кодової кодової панелі (згідно зі своїми документами, він "вводиться автоматично інструментом збирання") , тоді як CUDAfy робить.


Ось приклад створення програми за допомогою CUDAfy.


8

Ну це досить давнє запитання, і оскільки його задали, речі сильно змінилися.
Ще один варіант використання .Net для запису коду GPU, про який ніхто не згадував у відповідях у Alea GPU . Він охоплює C #, F # і VB.

Професійне середовище розробки програмного забезпечення для графічних процесорів для .NET та Mono. Воістину крос-платформа

На офіційному сайті F # Alea є першим варіантом використання F # в програмуванні GPGPU.
Для ознайомлення з цією рамкою пропоную ознайомитись із її вичерпним переліком прикладів .


1
Щойно побачивши вашу відповідь, видалю мою публікацію. Дивіться також інтерв'ю каналу 9 Сет Хуарес тут і тег SO тут )
Девід Кучча

@DavidCuccia Чудова робота щодо перевірки старих відповідей. А також дякую за канал 9 посилання (грудень 2016!)
Rsh

Я думаю, ти маєш на увазі цей запис 9 каналу
Даніель

@Daniel Я мав на увазі "посилання на запис 9 каналу". Це було неоднозначно? У будь-якому випадку, дякую за вказівку.
Rsh

@DavidCuccia вибачте за плутанину, посилання було важко помітити
Даніель

7

Крім Брахми, погляньте на C $ (вимовляється "C Bucks"). З їх сайту CodePlex :

Метою [C $] є створення єдиної мови та системи для безшовного паралельного програмування на сучасних GPU та процесорах.

Він заснований на C #, оцінюється ліниво і націлений на кілька моделей прискорювачів:

В даний час перелік призначених архітектур включає GPU, багатоядерний процесор, Multi-GPU (SLI, CrossFire) і Multi-GPU + Multi-CPU Hybrid Architecture.


7

У місті є нове рішення Microsoft - C ++ AMP ( тут представлено ).

Використовувати з C # можна через P / Invoke, як показано тут для настільних додатків, і тут для (не називайте його) програм метро.

Редагувати: Слід зазначити, що C ++ AMP має відкриту специфікацію , це означає, що це не обов'язково лише для компілятора MS або просто для Windows.

Редагувати: Мабуть, технологія зараз перебуває у "режимі обслуговування", тобто вони виправляють помилки, але не активно розвиваються.


2

Якось керований DirectX може працювати


2
Привітання з майбутнього. Незважаючи на те, що в той час є чудовою відповіддю, на жаль, MDX зараз не існує, замінивши його на XNA, який також не існує.
MickyD

2

Якщо ваші графічні процесори мають однакову марку, ви можете отримати підтримку GPGPU від постачальника через CUDA Nvidia або ATI-Stream. AFAIK, вони надають DLL-файли, якими ви можете користуватися через P / Invoke.



0

Якщо ви збираєтеся застосувати власні алгоритми, для яких потрібні власні ядра:

Нещодавно я завантажив мій проект з відкритим кодом у цей сховище github, який використовує OpenCL.

Що це робиться (ви можете перевірити і на його сторінці вікі) - це вибір декількох пристроїв, що підтримують OpenCL, і рядок ядра від користувача, і створити обгортки масивів C # або C ++, а потім обчислити, використовуючи всі, за допомогою автоматичного балансира завантаження та трубопровід (щоб приховати затримки), щоб отримати добру ефективність з ПК.

Ось приклад його використання (1024 робочих теми, розподілені на всі пристрої, кожен з яких працює з одним і тим же кодом, але використовують різні дані та 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

коли всі більше не використовуються, вони випускають усі ресурси C ++ зі своїми руйнівниками.

Але це не так вже й зріло, тому сміливо додайте будь-яку "проблему" на вкладці випусків github. Класи, що належать до multi-pc-cluster, не працюють і не перекладаються на англійську, але вони можуть використовувати принаймні всі пристрої в одному ПК.


-2

WPF також використовує GPU, і ви можете додавати власні шейдери за допомогою HLSL.


Наскільки мені відомо, WPF не має доступу до обчислень GPU. Якщо говорити про графіку WPF System.Windows.Media, це не реальна DirectX. Дуже повільно в порівнянні з програмуванням вершин нижнього рівня з SharpDX або SlimDX.
Pasi Tuomainen

Я додав посилання на серію статей про прискорені графічним процесором ефекти в WPF.
Марк Сідаде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.