STL,iostream,new,在C/C++中为CUDA删除

STL, iostream, new, delete in C/C++ for CUDA

本文关键字:C++ 中为 删除 CUDA iostream new STL      更新时间:2023-10-16

我可以在C/C++中为CUDA使用STL、iostream、new、delete吗?

如果您有费米级GPU(因此计算能力>=2.0),并且使用CUDA 4.0或更高版本,则newdelete都可用于设备代码。不支持STL容器和算法以及iostream。

如果您想在CUDA中使用"类似STL"的操作,您可能会对Thrust模板库感兴趣。它允许主机代码使用容器类型透明地与GPU交互,并实现了许多非常有用的数据并行原语,如排序、缩减和扫描。请注意,这仍然是一个主机端设备,Thrust及其容器不能在您自己的内核代码中使用。

让我们来分解一下。

一般情况:我可以在GPU上使用C++标准库构造XYZ吗

不,您不能在GPU上使用标准库代码(即在设备端代码中)。最直接的障碍是标准库没有针对CUDA编译器——没有表明其代码应该同时编译用于主机端和设备端执行。但是,即使有人放弃了这个技术问题,也有各种原因导致相当多的标准库在GPU上无法正常工作。

STL

正如talonmies所建议的,Thrust库以一种有用且封装良好的方式提供了一些类似STL的功能。但作为对你问题的回答,它仍然大多是"不",因为:

  1. 它的接口是主机端而不是设备端。也就是说,它会为你使用GPU做一些事情,但这些事情都是秘密的;它不是编写自己的设备端代码的工具箱
  2. 它涵盖了STL的一小部分:就数据结构而言,它本质上只是向量(AFAIK-我还没有搜索过代码);不支持使用iostream或类似抽象在GPU数据上进行流传输

iostreams

不,不能在CUDA设备端代码中使用iostream。我们确实有C样式的printf,但是:printf("my_int_value is %05dn", my_int_value);。不过,这与标准库printf()非常不同,因为它需要通过PCI总线发送数据,并让驱动程序将数据发送到主机端进程的输出流。

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

newdelete

newdelete操作符确实工作,类似于设备malloc()free(),这与主机端不同,并且有一定的局限性;请参阅RobertCrovella对此事的回答及其链接。

然而,我建议您仔细考虑是否真的需要在设备上进行内存分配和取消分配;从性能角度来看,这可能代价高昂,而且通常/通常可以通过主机端API调用预先分配内存来做得更好。