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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

Microsoft Research Accelerator представлял собой библиотеку GPU.NET GP.

Ответ 3

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

Ответ 4

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

Удачи!

Ответ 6

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

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


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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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