2010-11-07 5 views
29

Я не знаю концепций программирования GPU и API. У меня есть несколько вопросов:Выполнить код C# на графическом процессоре

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

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

Бест, Юзеф

+4

Низкоуровневый код лучше всего написан на языке низкого уровня. Нет веских оснований для этого в C#, когда есть лучшие альтернативы. –

+0

увидеть этот похожий вопрос: http://stackoverflow.com/questions/375011/utilizing-the-gpu-with-c-sharp – mcmillab

ответ

21

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

2) Да - HLSL с помощью Direct X или Open GL

3) не вообще возможно - CPU и GPU кодирования существенно отличаются

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

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

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

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

+7

-1 не говоря уже о OpenCL или DirectCompute. – Euphoric

+7

Ouch - это больно :) –

+1

-1: OpenGL использует GLSL не язык затенения HLSL –

2

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

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

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

17

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

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

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

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

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

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

+0

ссылка на tidepowered мертва, вот один из них git https://github.com/tidepowerd/GPU.NET-Example-Projects –

2

Есть также brahma. Он якобы захватывает выражения и компилирует их для графического процессора. Я не пробовал себя.

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

-1

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

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

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

Смежные вопросы