Вопрос

При написании приложений CUDA вы можете работать либо на уровне драйвера, либо на уровне среды выполнения, как показано на этом изображении (библиотеки CUFFT и CUBLAS для расширенных математических вычислений):

CUDA layer model
(источник: tomshw.it)

Я предполагаю, что компромиссом между ними является повышение производительности низкоуровневого API, но за счет увеличения сложности кода.Каковы конкретные различия и есть ли какие-то важные вещи, которые вы не можете сделать с помощью API высокого уровня?

Я использую CUDA.net для взаимодействия с C#, и он создан как копия API драйвера.Это побуждает писать много довольно сложного кода на C#, в то время как эквивалент C++ будет проще с использованием API среды выполнения.Можно ли что-нибудь выиграть, поступая таким образом?Единственное преимущество, которое я вижу, заключается в том, что интеллектуальную обработку ошибок легче интегрировать с остальной частью кода C#.

Это было полезно?

Решение

Среда выполнения CUDA позволяет компилировать и связывать ядра CUDA в исполняемые файлы.Это означает, что вам не нужно распространять файлы cubin вместе с вашим приложением или загружать их через API драйвера.Как вы заметили, в целом его проще использовать.

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

Очевидно, более подробную информацию об устройстве можно запросить через API драйвера, чем через API среды выполнения.Например, доступную на устройстве свободную память можно запросить только через API драйвера.

Из Руководства программиста CUDA:

Он состоит из двух API:

  • Низкоуровневый API, называемый API драйвера CUDA.
  • API более высокого уровня называется API времени выполнения CUDA, который реализован поверх API драйвера CUDA.

Эти API являются взаимоисключающими:Приложение должно использовать один или другой.

Среда выполнения CUDA упрощает управление кодом устройства, предоставляя неявные Инициализация, управление контекстом и управление модулями.Код узла C сгенерирован nvcc основан на среде выполнения CUDA (см. Подраздел 4.2.5), поэтому приложения, которые ссылаются на этот код, должны использовать API среды выполнения CUDA.

В отличие от этого, API драйвера CUDA требует больше кода, его сложнее программировать и debug, но предлагает лучший уровень контроля и не зависит от языка, так как он только работает с объектами cubin (см. Подраздел 4.2.5).В частности, сложнее конфигурировать и запускать ядра с помощью API драйвера CUDA, так как выполнение Параметры конфигурации и ядра должны быть указаны с помощью явных вызовов функций вместо синтаксиса конфигурации выполнения, описанного в Подразделе 4.2.3.Кроме того, устройство эмуляция (см. Подраздел 4.5.2.9) не работает с API драйвера CUDA.

Между API нет заметной разницы в производительности.Гораздо более выраженный эффект будет иметь то, как ваши ядра используют память и как она распределяется на графическом процессоре (в варпах и блоках).

Другие советы

Я обнаружил, что для развертывания библиотек в многопоточных приложениях контроль над контекстом CUDA, обеспечиваемый API драйвера, имеет решающее значение.Большинство моих клиентов хотят интегрировать ускорение графического процессора в существующие приложения, а в наши дни почти все приложения являются многопоточными.Поскольку я не мог гарантировать, что весь код графического процессора будет инициализирован, выполнен и освобожден из одного и того же потока, мне пришлось использовать API драйвера.

Мои первоначальные попытки с различными обходными путями в API среды выполнения приводили к провалу, иногда впечатляющим образом: я обнаружил, что могу многократно и мгновенно перезагружать машину, выполняя только неправильный набор вызовов CUDA из разных потоков.

Поскольку мы перенесли все через API драйверов, все прошло хорошо.

Дж

пара важных вещей, на которые стоит обратить внимание:

Сначала различия между API-интерфейсами относятся только к коду хоста. Ядра точно такие же. на стороне хоста сложность API драйвера довольно тривиальна, фундаментальные различия:

в драйвере API у вас есть доступ к функциям, которые недоступны в API времени выполнения, как контексты.

эмулятор работает только с кодом, написанным для API времени выполнения.

О, и в настоящее время очень удобная библиотека cudpp работает только с API среды выполнения.

Есть некоторые реальные проблемы с выравниванием аргументов и API драйвера. Ознакомьтесь с документацией по бета-версии CUDA 2.2 (или более поздней версии) для получения дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top