GPU设备函数如何访问主机函数中定义的类对象?

时间:2019-06-27 13:49:03

标签: c++ cuda gpu

我有一个现有的C ++程序,并且想将其迁移到GPU版本。内核函数需要访问宿主函数中定义的类对象。例如,将在线程中使用stringstream对象。但是,它无法通过Cuda中的编译。内核函数如何访问宿主函数中定义的此类类对象?

这里是一个例子。

#include <cstdio>
#include <sstream>

using namespace std;

__global__ void kernel(stringstream * sstr)
{
    printf("%s\n", sstr->str());
}

int main(int argc, char ** argv)
{
    stringstream * sstr;
    cudaMallocManaged(&sstr, sizeof(stringstream));
    *sstr  << "Hello world\n";
    kernel<<<32, 32>>>(sstr);
    cudaDeviceSynchronize();
    cudaFree(sstr);
    return 0;
}

我遇到以下编译错误。

$ nvcc -o bin src.cu
src.cu(8): warning: non-POD class type passed through ellipsis

src.cu(8): error: calling a __host__ function("std::__cxx11::basic_stringstream<char,  ::std::char_traits<char> , std::allocator<char> > ::str const") from a __global__ function("kernel") is not allowed

src.cu(8): error: identifier "std::__cxx11::basic_stringstream<char,  ::std::char_traits<char> , std::allocator<char> > ::str const" is undefined in device code

src.cu(8): error: calling a __host__ function("std::__cxx11::basic_string<char,  ::std::char_traits<char> , std::allocator<char> > ::~basic_string") from a __global__ function("kernel") is not allowed

src.cu(8): error: identifier "std::__cxx11::basic_string<char,  ::std::char_traits<char> , std::allocator<char> > ::~basic_string" is undefined in device code

4 errors detected in the compilation of "/tmp/tmpxft_00003bd0_00000000-8_src.cpp1.ii".

2 个答案:

答案 0 :(得分:3)

您不应该在内核中使用C ++ std类,因为与std :: stringstream相关的函数是从您的操作系统预先编译并链接的,因此nvcc不会生成相应的__device__函数。

查看此topic

答案 1 :(得分:0)

std::stringstream内部可能有一个动态分配的数组,您将无法在设备代码中访问该数组;将此类传递给GPU已经不是一个好主意。

您的编译在这里失败,因为您还尝试从设备代码中调用__host__函数,这是不可能的。 如果您希望它能正常工作,则可能需要一个适用于CUDA的自定义stringstream