在CUDA中添加字符串?

时间:2015-12-04 20:02:44

标签: c++ cuda

我想要做的是在设备中处理两个字符串并在主机上调用。我收到一个错误,告诉我不允许从全局调用主机功能。考虑到这一点,我将如何重新构建此代码,以便它通过设备运行?

__global__ void whatever(string *x, string *y){
    *x += *y;}
int main(){
    string x, y, *x_in, *y_in;
    x = "Hello ";
    y = "World!\n";
    cudaMalloc((void**)&x_in, sizeof(int));
    cudaMalloc((void**)&y_in, sizeof(int));
    cudaMemcpy(x_in, &x, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(y_in, &y, sizeof(int), cudaMemcpyHostToDevice);
    whatever << <1, 1 >> > (x_in, y_in);
    cudaMemcpy(&x, x_in, sizeof(int), cudaMemcpyDeviceToHost);
    cudaMemcpy(&y, y_in, sizeof(int), cudaMemcpyDeviceToHost);
    cudaFree(&x_in);
    cudaFree(&y_in);
    cout << x;
    return 0; }

1 个答案:

答案 0 :(得分:0)

回答你的问题:你打电话给*x += *y;,我。即std::string个对象的连接和赋值操作(显然只定义为STL中的主机函数)。

关于重组 - 你可以传递给设备char*缓冲区(当然,在设备上分配)而不是字符串对象并使用它们。

关于代码的更多要点:

  • 您只从设备复制sizeof(int)个字节,为什么?我看到你的数据超过4个字节;
  • 您为每个对象仅分配sizeof(int)个字节,为什么?
  • 您使用<< <1, 1> >>语法而不是<<<1, 1,>>>(我相信这只是在此处复制粘贴代码后的格式问题);
  • 主要问题 - 您可能会描述您希望通过这段代码实现什么目标?