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

Запустить код С# на графическом процессоре

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

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

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

Бест, Юзеф

4b9b3361

Ответ 1

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

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

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

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

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

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

Вы должны написать для CPU, но ферма выберете соответствующие параллельные вычисления для графического процессора.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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