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

std::vector< bool > упаковывает его содержимое, поэтому каждое булево значение хранится в одном бите, восемь бит - в байт. Это эффективно с точки зрения памяти, но вычислительно интенсивно, так как процессор должен выполнить арифметику для доступа к запрошенному биту. И это не работает с bool ссылкой или семантикой указателя, поскольку биты внутри байта не имеют адресов в объектной модели C ++.

Вы все же можете объявить переменную типа std::vector<bool>::reference и использовать как будто это было bool&. Это позволяет универсальным алгоритмам быть совместимыми.

std::vector< bool > bitvec( 22 );
std::vector< bool >::reference third = bitvec[ 2 ];
third = true; // assign value to referenced bit

В C ++ 11 вы можете обойти это с помощью auto и спецификатора &&, который автоматически выбирает ссылку на lvalue, привязанную к векторному элементу или ссылку rvalue, привязанную к временному.

std::vector< bool > bitvec( 22 );
auto &&third = bitvec[ 2 ]; // obtain a std::vector< bool >::reference
third = true; // assign value to referenced bit
38
задан Glorfindel 20 February 2019 в 05:02
поделиться

4 ответа

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

38
ответ дан mch 20 February 2019 в 05:02
поделиться

несколько важных вещей отметить:

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

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

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

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

4
ответ дан 20 February 2019 в 15:02
поделиться
  • 1
    Да, то, о чем я думал, var d = $(c.map(function(el){ return el[0]; }));. +1, потому что в настоящее время это - единственный ответ, который отвечает на исходный вопрос – zerkms 3 July 2012 в 04:03

Существуют некоторые реальные проблемы с выравниванием аргумента и API драйвера. Проверьте бету CUDA 2.2 (или позже) документация для получения дополнительной информации.

0
ответ дан 20 February 2019 в 15:02
поделиться

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

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

С тех пор, как мы перенесли все через Driver API, все было хорошо.

J

20
ответ дан 27 November 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: