CUDA:内存限定符的非法组合

Sim*_*ing 5 c++ cuda

我有以下代码:

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约定,这些约定可能对我来说尚不清楚。如果是这种情况,请告诉我,以便我跟上正确的编程实践。

yhf*_*377 5

我的理解是您希望以 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扩展名,并且您应该启用单独编译