如何将CUDA集成到现有的类结构中?

时间:2017-11-26 11:01:02

标签: c++ c++11 cuda

我有一个基于CPU的简单深度学习框架的实现,其中主要组件是计算图的节点,可以在张量上执行计算。

现在我需要将我的实现扩展到GPU,我想使用现有的类结构,只将其功能扩展到GPU,但是,我不确定这是否可能。

大多数类都有处理和返回张量的方法,例如:

tensor_ptr get_output();

其中tensor_ptr只是我的张量类的std::shared_ptr指针。现在我想做的是为每个这样的方法添加GPU版本。我想到的想法是在单独的文件struct中定义tensor_gpu.cuh,如下所示

struct cu_shape {
    int n_dims;
    int x,y,z;
    int len;
};

struct cu_tensor {
    __device__ float * array;
    cu_shape shape;
};

然后上一个函数将被镜像:

cu_tensor cu_get_output();

问题似乎是.cuh文件被视为常规头文件,并由默认的c ++编译器编译并出错:

error: attribute "device" does not apply here

__device__ float * array定义的行上。

我知道你不能混合使用CUDA和纯C ++代码,因此我计划将所有CUDA运行时api函数隐藏到.cu文件中,这些文件将在.h文件中定义。问题是我想在我的类中存储设备指针,然后将它们传递给CUDA调用函数。

这样我仍然可以使用所有现有的对象结构,只修改初始化和计算部分。

如果常规c ++类无法触及__device__标志的任何内容,那么如何将CUDA代码集成到C ++代码中呢?

您是否只能在.cu个文件中使用CUDA运行时调用和关键字?

或者是否有一些聪明的方法可以隐藏c ++编译器处理CUDA指针的事实?

非常感谢任何见解!

编辑:我似乎存在误解。您需要放置__device__标记,您仍然可以将其用作指向设备内存的指针。如果您有一些有价值的东西可以添加到CUDA集成的良好实践中或澄清其他内容,请不要犹豫!

1 个答案:

答案 0 :(得分:1)

' __'保留用于实现目的。这就是Nvidia实现可以使用__device__的原因。但另一个"常规" C ++实现有自己的保留符号。

事后看来,Nvidia本来可以设计出更好的解决方案,但这对你没有帮助。