STL, iostream, new, delete в C / C ++ для CUDA - PullRequest
6 голосов
/ 24 января 2012

Могу ли я использовать STL, iostream, new, delete в C / C ++ для CUDA?

Ответы [ 2 ]

9 голосов
/ 24 января 2012

Если у вас есть графический процессор класса Fermi (так что вычислительные возможности> = 2.0), и вы используете CUDA 4.0 или более позднюю версию, тогда и new, и delete доступны для использования в коде устройства. Контейнеры и алгоритмы STL и iostream не поддерживаются.

Если вы хотите использовать «STL-подобные» операции с CUDA, вас может заинтересовать библиотека шаблонов Thrust . Он позволяет хост-коду прозрачно взаимодействовать с графическим процессором, используя типы контейнеров, и реализует ряд очень полезных параллельных примитивов данных, таких как сортировка, уменьшение и сканирование. Обратите внимание, что это все еще устройство на стороне хоста, Thrust и его контейнеры нельзя использовать внутри вашего собственного кода ядра.

0 голосов
/ 15 мая 2017

Давайте разберем это немного.

Общий случай: могу ли я использовать стандартную библиотеку C ++ XYZ на графическом процессоре?

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

STL

Как подсказывает talonmies , библиотека Thrust предоставляет некоторые STL-подобные функциональные возможности, полезные и хорошо упакованные.Но это все же в основном «нет» в качестве ответа на ваш вопрос, поскольку:

  1. Его интерфейс на стороне хоста, а не на стороне устройства.То есть он будет делать что-то для вас, используя графический процессор, но они будут скрыты;это не набор инструментов для написания собственного кода на стороне устройства.
  2. Он охватывает небольшую часть STL: поскольку структуры данных идут, это, по сути, просто векторы (AFAIK - я не изучал код);потоковая передача данных на GPU с использованием iostreams или аналогичной абстракции не поддерживается

iostreams

Нет, вы не можете использовать iostream в коде на стороне устройства CUDA.Однако у нас есть printf в стиле C: printf("my_int_value is %05d\n", my_int_value);.Это очень отличающийся от стандартной библиотеки printf() зверь, так как он должен отправлять данные по шине PCI и иметь драйвер для передачи их в выходной поток процесса на стороне хоста.

Подробнее см. Руководство по программированию CUDA * о форматированном выводе .

new и delete

Операторы new и delete работают, как на устройстве malloc() и free() - что отличается от хоста и несколько ограничено;см. ответ Роберта Кровеллы по этому вопросу и ссылки в нем.

Однако я бы посоветовал вам очень внимательно подумать о том, действительно ли вам нужно выделять память на устройстве ираспределение;вероятно, это будет дорогостоящим с точки зрения производительности, и часто / обычно вы можете добиться большего успеха, предварительно выделив память через вызов API на стороне хоста.

...