STL,iostream,new,在C/C++中为CUDA删除
STL, iostream, new, delete in C/C++ for CUDA
我可以在C/C++中为CUDA使用STL、iostream、new、delete吗?
如果您有费米级GPU(因此计算能力>=2.0),并且使用CUDA 4.0或更高版本,则new
和delete
都可用于设备代码。不支持STL容器和算法以及iostream。
如果您想在CUDA中使用"类似STL"的操作,您可能会对Thrust模板库感兴趣。它允许主机代码使用容器类型透明地与GPU交互,并实现了许多非常有用的数据并行原语,如排序、缩减和扫描。请注意,这仍然是一个主机端设备,Thrust及其容器不能在您自己的内核代码中使用。
让我们来分解一下。
一般情况:我可以在GPU上使用C++标准库构造XYZ吗
不,您不能在GPU上使用标准库代码(即在设备端代码中)。最直接的障碍是标准库没有针对CUDA编译器——没有表明其代码应该同时编译用于主机端和设备端执行。但是,即使有人放弃了这个技术问题,也有各种原因导致相当多的标准库在GPU上无法正常工作。
STL
正如talonmies所建议的,Thrust库以一种有用且封装良好的方式提供了一些类似STL的功能。但作为对你问题的回答,它仍然大多是"不",因为:
- 它的接口是主机端而不是设备端。也就是说,它会为你使用GPU做一些事情,但这些事情都是秘密的;它不是编写自己的设备端代码的工具箱
- 它涵盖了STL的一小部分:就数据结构而言,它本质上只是向量(AFAIK-我还没有搜索过代码);不支持使用iostream或类似抽象在GPU数据上进行流传输
iostreams
不,不能在CUDA设备端代码中使用iostream。我们确实有C样式的printf,但是:printf("my_int_value is %05dn", my_int_value);
。不过,这与标准库printf()
非常不同,因为它需要通过PCI总线发送数据,并让驱动程序将数据发送到主机端进程的输出流。
有关详细信息,请参阅CUDA编程指南中有关格式化输出的部分。
new
和delete
new
和delete
操作符确实工作,类似于设备malloc()
和free()
,这与主机端不同,并且有一定的局限性;请参阅RobertCrovella对此事的回答及其链接。
然而,我建议您仔细考虑是否真的需要在设备上进行内存分配和取消分配;从性能角度来看,这可能代价高昂,而且通常/通常可以通过主机端API调用预先分配内存来做得更好。
- 如何在c++中为模板函数实例创建快捷方式
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在c++中为double类型的数组创建一个unique_ptr
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何在 C++20 计时中为日期添加天数?
- 在C++中为链表类创建实例
- 在 UML 类图中为C++类添加构造函数和析构函数
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中为表面制作邻接矩阵
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 在 C++ 中为文件名添加时间戳
- 如何在C++中为堆栈动态创建结构?
- 如何限制在C++中为单个类创建的对象数量?
- 在 c++11 中为 pthread 设置调度参数
- 从精灵表在 sfml 中为精灵制作动画
- 如何在C++中为字符串添加字符?
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符