Использование графического процессора с помощью c # [закрыто]

135

Я пытаюсь получить больше вычислительной мощности из моей сетки.

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

Кто-нибудь знает какие-либо библиотеки или получил пример кода?

Марк Сидаде
источник

Ответы:

156

[ Изменить октябрь 2017 года, так как даже этот ответ становится довольно старым ]

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

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

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

  • Hybridizer . Коммерческое решение компиляции C # для CUDA. Предоставляет бесплатную публикацию сообщества на рынке визуальных студий и примеры на github .

  • AleaGPU Коммерческое решение с бесплатной общественной версией для потребителей GPUS. Смотрите комментарии Даниила для деталей.

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

  • C $ - последняя разработка была более 10 лет назад ...

  • Microsoft Accelerator - похоже, не похоже, что он активно разрабатывается.

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

Как я уже сказал, я бы порекомендовал Cudafy всем остальным - если бы он мог работать как на OpenCL, так и на Cuda, это было бы идеально.

РЕДАКТИРОВАТЬ SEP 2013 Cudafy теперь позволяет вам компилировать как для CUDA, так и для OpenCL, поэтому будет запускать один и тот же код C # на всех графических процессорах. Это звучит фантастически, хотя я еще не тестировал компиляцию OpenCL.

mcmillab
источник
31
+1 за обновление полезного вопроса в виде быстро развивающейся темы.
филолог
2
Alea GPU quantalea.com обеспечивает поддержку CUDA для всех языков .NET, полностью кроссплатформенный и дает лучший опыт разработчика в отладке и профилировании кода .NET GPU.
Даниэль
Поддержка OpenCL в Cudafy довольно плохая - мне так и не удалось даже скомпилировать, когда мой проект вырос. Поэтому я буду придерживаться простого OpenCL и делать привязки к C #.
Либор
OpenCL, использующий Cudafy, прекрасно работает, я использую его уже много лет
mcmillab
Добавлены ссылки на проекты, чтобы помочь будущим посетителям.
Дэн Аткинсон
46

Microsoft Research Accelerator был библиотекой графического процессора .NET GP.

Марк Сидаде
источник
Это был отличный проект с плохой политикой лицензирования. К сожалению, больше не доступно на сайте MS ...
ForNeVeR
25

Я нашел Брахму ... У него также есть провайдер GPGPU, который позволяет запускать методы на GPU ... Спасибо за вопрос ... Сегодня узнал что-то новое. :)

Вьяс Бхаргхава
источник
10

Могу ли я порекомендовать XNA Game Studio в качестве возможного пути для исследования? Он явно предназначен для написания игр, но предоставляет вам управляемый доступ к вашей видеокарте и гораздо лучший доступ к функциям перечисления возможностей и разработке шейдеров, чем это было раньше, например, в Managed DirectX. Существуют также способы объединения WinForms и XNA в гибридные приложения:

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

Вам придется приложить некоторые усилия для обучения программированию шейдеров (XNA поддерживает HLSL), но это может быть более простой подход, чем изучение решения для конкретного поставщика, такого как nVidia CUDA. Преимущество в том, что вы можете программировать в 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?

pointernil
источник
2
Мне нравится эта идея, но они перестали отвечать на вопросы технической поддержки около двух лет назад, и сайт был более или менее закрыт в течение года, так что я думаю, что проект мертв. Видимо, автор на SO , хотя.
BlueRaja - Дэнни Пфлугхофт
Tidedpowerd остановил разработку GPU.NET и закрыл свой бизнес.
Даниэль
9

Вот еще один: CUDAfy . Это звучит как GPU.Net, в том, что что-то такое простое, как метод-атрибут, может привести к тому, что весь метод будет запущен на GPU. Но в отличие от GPU.Net, CUDAfy является бесплатным и открытым исходным кодом.

GPU.Net, по-видимому, не требует стандартного кода (согласно их документам, он «внедряется автоматически инструментом сборки») , в то время как CUDAfy делает это.


Вот пример построения приложения с помощью CUDAfy.

BlueRaja - Дэнни Пфлугхофт
источник
8

Ну, это довольно старый вопрос, и с тех пор, как его спросили, многое изменилось.
Еще один вариант использования .Net для написания кода GPU, о котором никто не упоминал в ответах в Alea GPU . Он охватывает C #, F # и VB.

Профессиональная среда разработки программного обеспечения для GPU .NET и Mono. Действительно кроссплатформенный

На официальном сайте F # Alea - первый вариант использования F # в программировании GPGPU.
Чтобы познакомиться с этой структурой, я предлагаю взглянуть на ее исчерпывающий список примеров .

Rsh
источник
1
Только что увидел ваш ответ, удалим мой пост. Смотрите также интервью 9-го канала Сета Хуареса здесь и SO tag здесь )
Дэвид Кучча
@DavidCuccia Отличная работа по проверке ваших старых ответов. А также спасибо за ссылку на канал 9 (декабрь 2016 года!)
Rsh
Я думаю , что вы имеете в виду этот канал 9 записи
Daniel
@Daniel Я имел в виду "ссылка на 9 канал записи". Это было неоднозначно? В любом случае, спасибо за указание.
Rsh
@DavidCuccia извините за путаницу, ссылку было трудно увидеть
Даниэль
7

В дополнение к Брахме, взгляните на C $ (произносится «C Bucks»). С их сайта CodePlex :

Целью [C $] является создание единого языка и системы для бесшовного параллельного программирования на современных графических процессорах и процессорах.

Он основан на C #, оценивается лениво и нацелен на несколько моделей ускорителей:

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

Дэвид Кучча
источник
7

В городе появилось новое решение Microsoft - C ++ AMP (введение здесь ).

Использование из C # будет осуществляться через P / Invoke, как показано здесь для настольных приложений и здесь (не называйте это) приложениями Metro.

Изменить: я должен отметить, что C ++ AMP имеет открытую спецификацию , что означает, что это не обязательно только для компилятора MS, или просто для Windows.

Изменить: По-видимому, технология сейчас находится в «режиме обслуживания», то есть они исправляют ошибки, но не активно развиваются.

Дэвид Кучча
источник
2

Управлял DirectX как-то, может работать

Грег Дин
источник
2
Привет из будущего. Хотя, возможно, в то время это был хороший ответ, к сожалению, MDX теперь уже не существует, его заменили на XNA, который также не существует.
MickyD
2

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

Coderer
источник
1

Программное обеспечение CenterSpace имеет вычисления на основе графического процессора в своих библиотеках NMath, которые вы можете добавить в проект C #. Это коммерческий продукт.

Pasi Tuomainen
источник
0

Если вы собираетесь применять свои собственные алгоритмы, для которых нужны собственные ядра:

Я недавно загрузил свой проект с открытым исходным кодом в этот репозиторий github, который использует OpenCL.

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

Вот пример его использования (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. Классы, относящиеся к нескольким компьютерным кластерам, не работают и еще не переведены на английский, но могут использовать как минимум все устройства в одном компьютере.

хусейн тугрул буюкисик
источник
-2

WPF также использует графический процессор, и вы можете добавлять собственные шейдеры, используя HLSL.

Марк Сидаде
источник
Насколько мне известно, WPF не имеет доступа к вычислениям GP GP. Если говорить о графике WPF System.Windows.Media, то это не настоящий DirectX. Очень медленный по сравнению с программированием вершин более низкого уровня с SharpDX или SlimDX.
Паси Туомайнен
Я добавил ссылку на серию статей о пользовательских эффектах с графическим ускорением в WPF.
Марк Сидаде