我有以下代码:
main.cu:
#include "class.h"
int main () {}
class.h:
class Class {
__global__
void Function() {};
};
当我使用命令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
我对每个错误都有疑问。为什么它“忽略”函数的__global__
限定符,为什么__global__
内存限定符在此上下文中是非法的?我已在documentation中读到了
E.2.10.2. Function Members
Static member functions cannot be __global__ functions.
但是,据我所知,我的功能不是静态成员。删除__global__
行可以编译,将__global__
和void Function();
行移动到main.cu中也是如此。如果实际上不允许这样做,为什么CUDA会强制执行此限制,以及在保持结构化代码的同时解决此问题的方法是什么?
为了澄清,我知道没有其他方法可以创建具有可以创建GPU内核的函数的类。在我看来,内核只能从main.cu中的全局函数创建。我对CUDA编程很新,所以我可能只是错过了一些我可能不清楚的CUDA约定。如果是这种情况,请告诉我,以便我能跟上正确的编程习惯。
答案 0 :(得分:1)
我的理解是您希望以OOP方式使用CUDA内核。如果是这种情况,下面的类结构应该有效:
// myclass.h
class MyClass {
public:
void call_kernel( ... );
};
// myclass.cu
__global__
void my_kernel( ... ) {
// do some work
}
void MyClass::call_kernel() {
// prepare data for the kernel, e.g. allocating memory, copying from host to device, etc.
// run kernel
my_kernel <<< ... >>>( ... );
// copy results from device to host, clean up, etc.
}
请注意,如果您有多个包含内核代码的类,其源代码文件应该都使用.cu
扩展名,您应该启用separate compilation。