Использование GPU с С#

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

Я использую все процессоры cpus/core, можно ли использовать GPU с С#.

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

+114
17 дек. '08 в 15:55
источник поделиться
14 ответов

[Редактировать OCT 2017, так как даже этот ответ становится довольно старым)

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

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

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

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

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

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

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

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

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

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

EDIT SEP 2013 Cudafy теперь позволяет вам скомпилировать как CUDA, так и OpenCL, поэтому будет работать тот же код С# на всех графических процессорах. Это звучит фантастически, хотя я еще не тестировал компиляцию OpenCL.

+123
05 дек. '12 в 0:49
источник

Связанные вопросы


Похожие вопросы

Microsoft Research Accelerator - это библиотека GP GP.

+44
17 дек. '08 в 16:46
источник

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

+23
17 дек. '08 в 18:50
источник

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

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

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

+8
20 нояб. '15 в 8:17
источник

Могу ли я рекомендовать 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/

Удачи!

+8
17 дек. '08 в 16:22
источник

Как насчет http://www.tidepowerd.com/ GPU.NET?

+8
05 авг. '11 в 12:14
источник

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

GPU.Net, похоже, не требует кода шаблона, хотя (согласно их документам, он "инъецируется автоматически с помощью инструмента построения" ), в то время как CUDAfy делает.


Здесь приведен пример создания приложения с CUDAfy.

+8
26 июл. '12 в 23:26
источник

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

Использование С# было бы через P/Invoke, как показано здесь для настольных приложений, и здесь для приложений (don't-call-it) Metro.

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

+7
31 авг. '12 в 21:54
источник

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

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

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

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

+7
03 нояб. '09 в 5:48
источник

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

+2
03 февр. '09 в 17:03
источник

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

+1
04 сент. '16 в 8:50
источник

Управляемый DirectX каким-то образом может работать

+1
17 дек. '08 в 15:57
источник

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

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

Что он делает (вы также можете проверить со своей страницы вики), выбирая несколько устройств с поддержкой OpenCL и строку ядра от пользователя и создавая обертки массивов С# или С++, затем вычисляйте все с помощью функции автоматической загрузки, балансировщик и 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

когда все они больше не используются, они освобождают все ресурсы С++ с помощью своих деструкторов.

Но это не так зрело, поэтому не стесняйтесь добавлять какие-либо "проблемы" на вкладке github issues. Соответствующие классы с несколькими ПК-кланами не работают и не переведены на английский язык, но, по крайней мере, могут использовать все устройства в одном компьютере.

0
08 апр. '17 в 8:33
источник

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

-2
03 февр. '09 в 16:49
источник

Посмотрите другие вопросы по меткам или Задайте вопрос