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

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

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

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

лучшие, Йозеф!--1-->

6 ответов


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

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

3) как правило, невозможно-CPU и GPU кодирование принципиально разные

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

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

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

вы должны писать для CPU, но Фарм из соответствующих параллельных вычислений на GPU.


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

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

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

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

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

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


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

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

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


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

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


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


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

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

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