我有一个基于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集成的良好实践中或澄清其他内容,请不要犹豫!
答案 0 :(得分:1)
' __'保留用于实现目的。这就是Nvidia实现可以使用__device__
的原因。但另一个"常规" C ++实现有自己的保留符号。
事后看来,Nvidia本来可以设计出更好的解决方案,但这对你没有帮助。