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

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

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

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

14 ответов

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

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

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

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

  • Гибридизатор Коммерческое решение компиляции 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.

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

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

Могу ли я порекомендовать XNA Game Studio в качестве возможного пути для исследования? Он явно предназначен для написания игр, но дает вам управляемый доступ к вашей видеокарте и гораздо лучший доступ к функциям перечисления возможностей и разработке шейдеров, чем это было раньше, например, в Managed 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/

Удачи!

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам