Запустите код C # на GPU - PullRequest
       40

Запустите код C # на GPU

32 голосов
/ 08 ноября 2010

У меня нет знаний о концепциях и API программирования GPU.У меня есть несколько вопросов:

  1. Можно ли написать кусок управляемого кода C # и скомпилировать / преобразовать его в какой-то модуль, который может быть выполнен на GPU?Или я обречен иметь две реализации, одну для управляемого на ЦПУ и одну для GPU (я понимаю, что будут ограничения на то, что может быть выполнено на GPU)?
  2. Существуют ли приличные изрелый API для независимого программирования с различными поставщиками оборудования для графических процессоров (т. е. с общим API)?
  3. Существуют ли передовые практики, если вы хотите разрабатывать приложения, работающие на CPU, написанные на управляемом языке, а также обеспечивать оптимизацию скоростиесли есть подходящее оборудование для графического процессора?

Я также был бы рад ссылкам на любую документацию с соответствующими учебными ресурсами.

Best, Jozef

Ответы [ 6 ]

22 голосов
/ 08 ноября 2010

1) Нет - не для общего случая C # - очевидно, что-нибудь может быть создано для некоторого подмножества языка

2) Да - HLSL с использованием Direct X или Open GL

3) Как правило, невозможно - кодирование процессора и графического процессора принципиально отличается

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

Попытка написать общую программу в графическом процессоре с большим количеством веток и т. Д. Просто не будет эффективной - возможно, даже невозможной.

Их архитектуры доступа к памяти совершенно разные.

Вы должны писать для ЦП, но обрабатывать соответствующие параллельные вычисления для GPU.

17 голосов
/ 08 ноября 2010

1) Нет, не для общего случая C #, но для небольшого подмножества, да. Либо через среду выполнения (проверьте Tidepowerd GPU.NET), либо через языковую поддержку (LINQ или Code Quotations).

2) Да, DirectCompute (вычислительные шейдеры DX11) и OpenCL являются независимыми от производителя зрелыми API, и для них можно найти привязку .NET.

3) Нет, как сказал Джеймс, они разные звери. GPU - это процессоры с высокой задержкой, оптимизированные для параллельных приложений с высокой пропускной способностью, тогда как CPU - процессоры с низкой задержкой, оптимизированные для последовательных приложений общего назначения.

Единственный известный мне исследовательский проект, который пытается решить эту проблему, - это язык SPAP .

Мой совет, не пытайтесь найти идеальный универсальный API / время выполнения, потому что его нет. Выберите существующую технологию (DirectCompute или OpenCL) и узнайте, как вы можете использовать ее для своего бизнеса.

Полезные ссылки для запуска:

2 голосов
/ 08 ноября 2010

Есть также Брахма . Он предположительно захватывает выражения и компилирует их для GPU. Я не пробовал себя.

И у Microsoft есть исследовательский прототип под названием ускоритель , который похож на цель, но синтаксически отличается.

2 голосов
/ 08 ноября 2010

1) Не то, что я знаю, но может быть библиотека для C #, которая может вам помочь.

2) OpenCL.Он не зависит от графического процессора и может работать даже на процессорах.

3) OpenCL поможет вам в этом, вы можете компилировать и для CPU с помощью OpenCL, хотя я не уверен, насколько он хорош для процессора.,В последнее время я действительно влюбился в OpenCL, он работает очень хорошо.

1 голос
/ 15 июня 2018

Вы смотрели на Alea GPU ? Там библиотеки, хотя и не полностью бесплатные, имеют справедливую лицензию. Отличная документация и впечатляющая цепочка инструментов.

0 голосов
/ 21 марта 2015

Для Java см. Проект Aparapi (https://github.com/aparapi/aparapi).. Это позволяет запускать подмножество Java на любом графическом процессоре, поддерживающем OpenCL. Байт-код классов ядра кросс-компилируется во время выполнения к коду OpenCL.жесткие ограничения на код Java, которые могут быть кросс-скомпилированы - практически никакие объекты не могут быть использованы в качестве полей, локальных переменных или аргументов метода.

Тем не менее, существенным преимуществом является то, что ядра могут выполняться в Java или OpenCL (с автоматическим откатом к выполнению Java ThreadPool в случае недоступности соответствующего устройства GPU / APU. Это звучит как самая близкая вещь к тому, что вы ищете в части 3 вашего вопроса (хотя, конечно, управляемый язык не является C #).

Я не знаю ничего подобного в C #.

...