API драйвера CUDA и среда выполнения CUDA

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

Модель слоя CUDA
(источник: tomshw.it)

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

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


person Morten Christiansen    schedule 28.10.2008    source источник
comment
Одним из преимуществ API-интерфейса драйвера было бы добавление разработчиками компиляторов поддержки написания ядер на языках, отличных от подмножества CUDA языка C.   -  person Gautham Ganapathy    schedule 22.10.2009


Ответы (4)


Среда выполнения 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 требует больше кода, его сложнее программировать и отлаживать, но он предлагает лучший уровень контроля и не зависит от языка, поскольку работает только с объектами cubin (см. Раздел 4.2.5). В частности, сложнее настраивать и запускать ядра с помощью API-интерфейса драйвера CUDA, поскольку конфигурация выполнения и параметры ядра должны быть указаны с помощью явных вызовов функций вместо синтаксиса конфигурации выполнения, описанного в разделе 4.2.3. Кроме того, эмуляция устройства (см. Раздел 4.5.2.9) не работает с API-интерфейсом драйвера CUDA.

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

person mch    schedule 31.10.2008
comment
Это цитата? Если да, то не могу найти. Не могли бы вы назвать точное название документа и главу, в которой это можно найти? - person dialer; 16.06.2012
comment
These APIs are mutually exclusive: с более новыми версиями CUDA это уже не так. Теперь в документации указано An application can mix runtime API code with driver API code. Также см. фр. stackoverflow.com/a/27014990/1938163 - person Marco A.; 19.11.2014
comment
@dialer Я нашел это, но оно очень старое slideshare.net/PedramMazloom/nvidia-cuda-programmingguide10 - person Mike Vella; 06.06.2018

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

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

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

J

person Jason Dale    schedule 25.03.2010
comment
Можете ли вы подробнее рассказать или дать ссылку на что-нибудь, объясняющее, как использование драйвера напрямую помогает вам контролировать время выполнения этих различных задач? - person einpoklum; 02.02.2016
comment
@einpoklum Вы должны создать контекст, чтобы совершать звонки, поэтому у вас есть возможность, например. выделение одного на поток вместо того, чтобы предоставлять гарантии времени выполнения, что неправильный поток действует в неявно совместно используемом контексте API времени выполнения - person mabraham; 28.05.2018
comment
@mabraham: То есть, по сути, речь идет о контекстах CUDA для каждого потока и общих контекстах? - person einpoklum; 29.05.2018
comment
@einpoklum Да, API среды выполнения имеет неявный контекст, который используется всеми потоками. API драйвера обеспечивает большую гибкость. - person mabraham; 29.05.2018

пару важных моментов на заметку:

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

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

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

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

person Community    schedule 01.03.2009

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

person Community    schedule 20.03.2009
comment
Это так и сегодня? - person einpoklum; 02.02.2016