Подтвердить что ты не робот

Как использовать GPU для математики

Я рассматриваю использование GPU для хрустания некоторых уравнений, но не могу понять, как я могу получить к нему доступ с С#. Я знаю, что рамки XNA и DirectX позволяют использовать шейдеры для доступа к графическому процессору, но как я могу получить доступ к нему без этих фреймворков?

4b9b3361

Ответ 1

Я не делал этого с С#, но в основном вы используете CUDA (при условии, что вы используете карту nVidia здесь, конечно) SDK и инструментарий CUDA, чтобы отключить его.

nVidia перенесла (или написала?) реализацию BLAS для использования на устройствах с поддержкой CUDA. Они предоставили множество примеров того, как делать хруст числа, хотя вам придется выяснить, как вы собираетесь снять его с С#. Моя ставка заключается в том, что вам придется писать какие-то вещи в неуправляемом C или С++ и связываться с ним.

Если вы не зацикливаетесь на использовании С#, посмотрите Theano. Это может быть чересчур избыточным для ваших нужд, поскольку они создают рамки для машинного обучения на графических процессорах с Python, но... он работает и работает очень хорошо.

Ответ 2

Как насчет Brahma (LINQ to GPU)?

Надо любить LINQ!

Ответ 3

Если ваш GPU - это NVidia, вы можете использовать CUDA.

Здесь приведен пример, который объясняет всю цепочку, включая некоторый код C/С++: Интеграция CUDA с С#

И есть библиотека под названием CUDA.NET, доступная здесь: CUDA.NET

Если ваш GPU - ATI, то ATI Stream. Поддержка .NET для меня менее понятна. Возможно, Open Toolkit Library имеет OpenCL поддержка.

И наконец, есть проект Microsoft Research под названием "Accelerator ", который имеет управляемую оболочку, которая должна работать на любом оборудовании (при условии он поддерживает DirectX 9).

Ответ 4

Есть два варианта, если вы не хотите вмешиваться в материал P/Invoke и неуправляемый код:

  • Использовать упомянутую CUDA.NET библиотеку. Он работает очень хорошо, но он нацелен на CUDA, поэтому только карты nVidia. Если вы хотите решить более сложные проблемы, вам нужно изучить CUDA, написать собственное ядро ​​(в C...), скомпилировать его с помощью nvcc и выполнить из С# через эту библиотеку.
  • Используйте Microsoft Research Accelerator. Это хорошая библиотека, созданная MS Research, которая запускает ваш код на все, что имеет много ядер (многоядерные графические процессоры nVidia/ATI и многоядерные процессоры). Он полностью независим от платформы. Использовал его, и я очень впечатлен результатами. Существует также очень хороший учебник об использовании Accelerator в С#.

Второй вариант - это то, что я бы рекомендовал, но если у вас нет проблем с прилипанием только к графическим процессорам nVidia - первый, вероятно, будет быстрее.

Ответ 5

Я сделал это на С#, используя библиотеки NVIDIA CUDA и .NET P/invoke. Это требует некоторого тщательного управления памятью и хорошего детального понимания библиотек CUDA. Этот метод можно использовать в сочетании с любыми отдельными ядрами GPU/CUDA, которые вы хотели бы создать на C, поэтому это очень мощный гибкий подход.

Если вы хотите сэкономить много усилий, вы можете купить NMath Premium от программного обеспечения CenterSpace (для кого я работаю), и вы можете выполняйте большие проблемы на графическом процессоре NVIDIA за считанные минуты от С#. NMath Premium - большая математическая библиотека С#/. NET, которая может запускать большую часть LAPACK и FFT на графическом процессоре, но возвращается к CPU, если аппаратное обеспечение недоступно или размер проблемы не оправдывает поездки туда и обратно на GPU.

Ответ 6

Я боюсь, что мои знания об использовании графического процессора являются довольно теоретическими, помимо написания шейдеров для DirectX/XNA и немного путайте CUDA (специфичный для NVidia). Однако я много слышал об OpenCL (Open Computing Language), который позволяет запускать алгоритмы, которые OpenCL будет разумно выталкивать на ваши видеокарты или запускаться на CPU, если у вас нет совместимого графического процессора.

Код, который вы запускаете на графическом процессоре, должен быть написан специально в подмножестве OpenCL C99 (извинения, если это не соответствует вашим требованиям, так как вы спросили, как использовать его с С#), но помимо алгоритмов хеширования числа, вы можете написать остальную часть своего приложения на С# и все это прекрасно работает, используя Open Toolkit;

http://www.opentk.com/