API драйвера CUDA и среда выполнения CUDA - PullRequest
37 голосов
/ 28 октября 2008

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 31 октября 2008

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

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

19 голосов
/ 26 марта 2010

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

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

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

J

3 голосов
/ 01 марта 2009

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

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

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

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

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

0 голосов
/ 20 марта 2009

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

...