【问题标题】:Can string data types be used in C++ CUDA kernels?可以在 C++ CUDA 内核中使用字符串数据类型吗?
【发布时间】:2012-03-28 15:24:25
【问题描述】:

我正在编写一个 CUDA 内核,我在其中使用 C++ 中的 string 数据类型。但是,编译器抛出以下错误:

error: calling a host function("std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator =") from a __device__/__global__ function("doDecompression") is not allowed

内核中不允许使用字符串吗?如果没有,在内核中为 char 数组分配空间的解决方法是什么?

【问题讨论】:

  • 在内核函数中使用 C 字符串
  • @PaulR:假设我将一个 C++ 字符串数组传递给我的内核。 CUDA 没有抱怨这一点。如何将其转换为内核中的 C 字符串。请举例
  • 您只需将底层数据传递给内核——使用string::c_str()方法在宿主代码中提取指向C数据的指针并将这些指针传递给内核函数
  • 保罗:这还不够。底层 char 数组 (c_str) 需要复制到设备内存中。
  • @Ashwin:您能否举个例子详细说明一下。我不知道保罗说了什么

标签: cuda gpgpu


【解决方案1】:

您不能在内核中使用 C++ string 类型,因为 CUDA 不包含能够在 GPU 上运行的 C++ 字符串库的设备版本。即使可以在内核中使用string,这也不是您想要做的事情,因为string 动态处理内存,这可能会很慢。

相反,创建一个固定长度的字符串数组并将字符串复制到其中。然后将数组复制到 GPU。将字符串数组的基地址传递给内核,并让每个线程通过将基于其索引的偏移量添加到基地址来计算给定字符串的地址。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多