我有以下代码:
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约定,这些约定可能对我来说尚不清楚。如果是这种情况,请告诉我,以便我跟上正确的编程实践。
我的理解是您希望以 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.
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您有多个包含内核代码的类,它们的源代码文件应该都使用.cu扩展名,并且您应该启用单独编译。