Я пытаюсь получить больше вычислительной мощности из моей сетки.
Я использую все процессоры / ядра, возможно ли использовать графический процессор с C #.
Кто-нибудь знает какие-либо библиотеки или получил пример кода?
Я пытаюсь получить больше вычислительной мощности из моей сетки.
Я использую все процессоры / ядра, возможно ли использовать графический процессор с C #.
Кто-нибудь знает какие-либо библиотеки или получил пример кода?
Ответы:
[ Изменить октябрь 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.
Microsoft Research Accelerator был библиотекой графического процессора .NET GP.
Я нашел Брахму ... У него также есть провайдер GPGPU, который позволяет запускать методы на GPU ... Спасибо за вопрос ... Сегодня узнал что-то новое. :)
Могу ли я порекомендовать 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://www.tidepowerd.com/ GPU.NET?
Вот еще один: CUDAfy . Это звучит как GPU.Net, в том, что что-то такое простое, как метод-атрибут, может привести к тому, что весь метод будет запущен на GPU. Но в отличие от GPU.Net, CUDAfy является бесплатным и открытым исходным кодом.
GPU.Net, по-видимому, не требует стандартного кода (согласно их документам, он «внедряется автоматически инструментом сборки») , в то время как CUDAfy делает это.
Вот пример построения приложения с помощью CUDAfy.
Ну, это довольно старый вопрос, и с тех пор, как его спросили, многое изменилось.
Еще один вариант использования .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 #. Это коммерческий продукт.
Если вы собираетесь применять свои собственные алгоритмы, для которых нужны собственные ядра:
Я недавно загрузил свой проект с открытым исходным кодом в этот репозиторий 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.