Давайте разберем это немного.
Общий случай: могу ли я использовать стандартную библиотеку C ++ XYZ на графическом процессоре?
Нет, вы не можете использовать стандартный библиотечный код на графическом процессоре(т.е. в вашем коде на стороне устройства).Самым прямым препятствием является то, что стандартная библиотека не предназначена для компилятора CUDA - не указывая, что ее код должен быть скомпилирован как для выполнения на стороне хоста, так и на стороне устройства.Но даже если эта техническая проблема была решена кем-то, существуют различные причины, по которым значительная часть стандартной библиотеки не будет работать как есть или вообще на графическом процессоре.
STL
Как подсказывает talonmies , библиотека Thrust предоставляет некоторые STL-подобные функциональные возможности, полезные и хорошо упакованные.Но это все же в основном «нет» в качестве ответа на ваш вопрос, поскольку:
- Его интерфейс на стороне хоста, а не на стороне устройства.То есть он будет делать что-то для вас, используя графический процессор, но они будут скрыты;это не набор инструментов для написания собственного кода на стороне устройства.
- Он охватывает небольшую часть 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 на стороне хоста.