【问题标题】:STL, iostream, new, delete in C/C++ for CUDA用于 CUDA 的 C/C++ 中的 STL、iostream、新建、删除
【发布时间】:2012-02-17 16:35:06
【问题描述】:

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

【问题讨论】:

  • C++中只能使用STL、iostream、new和delete
  • 我能找到的最相关的东西是code.google.com/p/thrust
  • 你读过the CUDA documentation吗?特别是Thrust Quick Start Guide?是什么让你质疑这个?
  • @ 投反对票的人。当然,这可能是一个对大多数人都有明显答案的问题,但有时并非所有人。他提出了一个合理的问题,并且确定我们有“首先进行 google 搜索”之类的基本规则,但是如果您花 2 秒钟时间查看,您会发现他是该网站的全新用户。给他一个热烈的欢迎和对常见问题的参考或其他东西,而不是让他对网站的第一印象是一群开车经过并给他投票的人。
  • 如果您觉得需要在 CUDA 代码中使用 STL 和 iostream 之类的东西,那么您可能不了解 GPGPU 可用于的问题领域

标签: c++ c stl cuda iostream


【解决方案1】:

如果您有一个 Fermi 类 GPU(因此计算能力 >=2.0),并且使用的是 CUDA 4.0 或更高版本,那么newdelete 都可以在设备代码中使用。不支持 STL 容器和算法以及 iostream。

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

【讨论】:

    【解决方案2】:

    让我们分解一下。

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

    不,您不能在 GPU 上使用标准库代码(即在您的设备端代码中)。最直接的障碍是标准库不是针对 CUDA 编译器 - 没有表明它的代码应该为主机端和设备端执行而编译。但是,即使有人免除了这个技术问题,也有很多原因导致相当多的标准库无法在 GPU 上按原样运行或根本无法运行。

    STL

    作为 talonmies suggests,Thrust 库以一种有用且封装良好的方式提供了一些类似 STL 的功能。但它仍然主要是“否”作为您问题的答案,因为:

    1. 它的接口是主机端而不是设备端。也就是说,它会使用 GPU 为您做一些事情,但那些事情将在幕后;它不是编写您自己的设备端代码的工具箱。
    2. 它涵盖了 STL 的一小部分:随着数据结构的发展,它本质上只是向量(AFAIK - 我没有仔细研究代码);不支持使用 iostreams 或类似抽象在 GPU 上传输数据

    iostreams

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

    详情请参阅CUDA Programming Guidesection on formatted output

    newdelete

    newdelete 操作符确实可以工作,类似于设备上的 malloc()free() - 这与主机端不同并且有些限制;请参阅 RobertCrovella 的 answer 关于此事及其中的链接。

    不过,我建议您仔细考虑是否真的需要在设备上进行内存分配和解除分配;在性能方面,它可能代价高昂,并且通常/通常您可以通过主机端 API 调用预先分配内存来做得更好。

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2016-04-19
      相关资源
      最近更新 更多