我有以下代码:
main.cu:
#include "class.h"
int main () {}
Run Code Online (Sandbox Code Playgroud)
class.h:
class Class {
__global__
void Function() {};
};
Run Code Online (Sandbox Code Playgroud)
使用命令编译此代码时nvcc -c main.cu -o main.o,出现以下错误:
class.h(3): warning: inline qualifier ignored for "global" function
class.h(3): error: illegal combination of memory qualifiers
Run Code Online (Sandbox Code Playgroud)
我对每个错误都有疑问。为什么它“忽略” __global__函数的限定符,为什么__global__在这种情况下内存限定符是非法的?我已经中读取文件是
E.2.10.2. Function Members
Static member functions cannot be __global__ functions.
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,我的函数不是静态成员。删除该__global__行可对其进行编译,将__global__和void Function();行移动到main.cu中也是如此。如果这实际上是ISN不允许的,那么CUDA为什么要强制执行此限制,并且在保持结构化代码的同时如何解决此问题?
需要澄清的是,我没有其他办法来创建具有可以创建GPU内核的函数的类。在我看来,内核只能从main.cu中的全局函数创建。我对CUDA编程相当陌生,因此我可能只是缺少一些CUDA约定,这些约定可能对我来说尚不清楚。如果是这种情况,请告诉我,以便我跟上正确的编程实践。
我有一个Parent类和一个继承Child类:
class Parent {};
class Child : public Parent {};
Run Code Online (Sandbox Code Playgroud)
有几个子类继承自Parent,但为了简单起见,我只包含了一个。这些继承的类对于我正在从事的项目是必需的。我还有另一个类的对象,我希望将其复制到设备上:
class CopyClass {
public:
Parent ** par;
};
Run Code Online (Sandbox Code Playgroud)
请注意,之所以Parent ** par;存在,是因为我需要一个Child对象列表,但它将使用哪个子对象(以及列表的长度)在编译时未知。这是我将CopyClass对象复制到设备上的尝试:
int length = 5;
//Instantiate object on the CPU
CopyClass cpuClass;
cpuClass.par = new Parent*[length];
for(int i = 0; i < length; ++i) cpuClass.par[i] = new Child;
//Copy object onto GPU
CopyClass * gpuClass;
cudaMalloc(&gpuClass,sizeof(CopyClass));
cudaMemcpy(gpuClass,&cpuClass,sizeof(CopyClass),cudaMemcpyHostToDevice);
//Copy dynamically allocated variables to GPU
Parent ** …Run Code Online (Sandbox Code Playgroud)