用于CUDA的C/C++中的STL、iostream、new和delete

6

我可以在CUDA中使用STL、iostream、new和delete吗?


3
在C++中,你只能使用STL、iostream、new和delete。 - jrok
我能找到的最相关的东西是http://code.google.com/p/thrust/。 - user562566
你阅读过CUDA文档了吗?特别是Thrust快速入门指南?什么让你产生疑问了? - johnsyweb
5
针对那些点踩的人。确实,这对大多数人来说可能是一个显然答案的问题,但有时候并非如此。他提出了一个合理的问题,当然我们有基本规则,比如“先谷歌搜索”,但如果你花2秒钟去看一下,你会发现他是新来的。为什么不给他一个热情的欢迎和FAQ的参考,而不是让他对这个网站留下印象,认为一群人驱车而过并将他点踩呢? - user562566
1
如果你觉得需要在CUDA代码中使用STL和iostream这样的东西,那么你很可能不理解GPGPU有用的问题领域。 - Paul R
据我所知,nvopencc是一种C编译器。它确实支持一些C++特性,例如模板,但受到很大限制。因此,没有STL、异常、iostream等等。我听说有些人能够使用g++/msvc编译器编译.cpp文件,然后将对象与nvcc链接,但我从未尝试过这样做。 - Renan Greinert
2个回答

11
如果您拥有Fermi类GPU(因此计算能力> = 2.0),并且使用CUDA 4.0或更高版本,则可以在设备代码中使用newdelete。不支持STL容器、算法和iostream。
如果您想在CUDA中使用"类似STL"的操作,您可能会对Thrust模板库感兴趣。它允许主机代码通过容器类型与GPU透明地交互,并实现了许多非常有用的数据并行原语,如排序、归约和扫描。请注意,这仍然是一种主机端工具,Thrust及其容器不能在您自己的内核代码内使用。

1

让我们分解一下。

通用情况:我能在GPU上使用C++标准库构造XYZ吗?

不行,在GPU上不能使用标准库代码(即在设备端代码中)。最直接的障碍是标准库没有针对CUDA编译器 - 没有指示其代码应同时编译为主机端和设备端执行。但即使这个技术问题被解决了,仍然有很多原因导致标准库的相当一部分内容不能按原样或根本不能在GPU上工作。

STL

正如talonmies suggests所说,Thrust库提供了一些类似STL的功能,以一种有用和良好打包的方式呈现。但对于你的问题,它仍然基本上是否定的答案,因为:

  1. 它的接口是主机端而不是设备端。也就是说,它会使用GPU为您执行操作,但这些操作将在幕后进行;它不是用来编写自己的设备端代码的工具箱。
  2. 它涵盖了STL的一小部分:就数据结构而言,它基本上只是向量(据我所知-我还没有仔细查看代码);使用iostreams或类似的抽象流来流式传输GPU上的数据是不受支持的。

iostreams

不,您不能在CUDA设备端代码中使用iostream。但是我们确实有C风格的printf:printf("my_int_value is %05d\n", my_int_value);。然而,这与标准库的printf()非常不同,因为它需要将数据发送到PCI总线,并使驱动程序将其传递给主机端进程的输出流。

有关详细信息,请参见CUDA编程指南中的格式化输出部分

newdelete

newdelete 运算符的工作方式类似于设备上的 malloc()free(),但与主机端有所不同,并且受到一定限制;请参阅 RobertCrovella 在此问题上的 答案 及其中的链接。

然而,我建议您仔细考虑是否真的需要进行设备上的内存分配和释放;这很可能会在性能方面造成昂贵的代价,并且通常/通常情况下,您可以通过主机端 API 调用来更好地预先分配内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接