Запуск кода C# на GPU
У меня нет знаний о концепциях программирования GPU и API. У меня есть несколько вопросов:
- можно ли написать управляемый код C# и скомпилировать/перевести его на какой-то модуль, который может быть выполнен на GPU? Или я обречен иметь две реализации, одну для управляемого процессора и одну для GPU (я понимаю, что будут ограничения на то, что может быть выполнено на GPU)?
- существует ли достойный и зрелый API для программирования независимо от различных поставщиков оборудования GPU (т. е. общего API)?
- есть ли какие-либо рекомендации, Если вы хотите разрабатывать приложения, которые работают на 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) и посмотрите, как вы можете использовать ее для своего бизнеса.
Полезные ссылки для начало:
- Microsoft DirectCompute SDK (DirectCompute является частью DirectX SDK)
- NVIDIA Compute SDK (тонны образцов, CUDA, DirectCompute и OpenCL)
- AMD Stream SDK (в основном образцы 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#.