Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将CUDA集成到现有的类结构中?_C++_C++11_Cuda - Fatal编程技术网

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

C++ 如何将CUDA集成到现有的类结构中?,c++,c++11,cuda,C++,C++11,Cuda,我有一个基于CPU的简单深度学习框架的工作实现,其中主要组件是计算图的节点,可以对张量执行计算 现在我需要将我的实现扩展到GPU,我想使用现有的类结构,只将其功能扩展到GPU,但是,我不确定这是否可行 大多数类都有处理和返回张量的方法,例如: tensor_ptr get_output(); 其中,tensor\u ptr只是我的tensor类的std::shared\u ptr指针。现在我想做的是为每种方法添加一个GPU版本。我的想法是在一个单独的文件tensor\u gpu.cuh中定义一

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

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

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

tensor_ptr get_output();
其中,
tensor\u ptr
只是我的tensor类的
std::shared\u ptr
指针。现在我想做的是为每种方法添加一个GPU版本。我的想法是在一个单独的文件
tensor\u gpu.cuh
中定义一个
struct
,如下所示

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 < /Cux>文件被当作一个常规的头文件处理,并由默认的C++编译器编译,并给出错误:

error: attribute "device" does not apply here
在具有
\uuuu设备\uuuuu浮点*数组定义的行上

<>我知道你不能混合CUDA和纯C++代码,所以我计划把所有的CUDA运行时API函数隐藏到 Cu/Cux>文件中,这些文件将在<代码> .H/COD>文件中定义。问题是我想在类中存储设备指针,然后将它们传递给CUDA调用函数

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

如果一个规则的C++类不能用C++来触碰任何东西,那么,你怎么能把CUDA代码集成到C++代码中呢? 只能在

.cu
文件中使用CUDA运行时调用和关键字吗

还是有一些聪明的方法来隐藏C++编译器处理CUDA指针的事实? 任何洞察都是非常感激的


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

“uuuu”保留用于实施目的。这就是英伟达实现可以使用<代码>但是另一个“正则”C++实现有自己的保留符号。
事后看来,Nvidia本可以设计出更好的解决方案,但这对您毫无帮助。

您能详细说明一下吗?您所说的实施目的是什么意思?这些属性可以在
.cu
文件中使用,但不能在其他任何地方使用。我的猜测是,它只是nvcc编译器的一个有效属性,还是完全是另一个属性?它对nvcc是有效的。我不知道它在python或java中做什么。这就是断章取义的问题所在。甚至在C++中,它也脱离了上下文。