CUDA:非法组合内存限定符

时间:2016-11-12 02:13:57

标签: c++ cuda

我有以下代码:

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约定。如果是这种情况,请告诉我,以便我能跟上正确的编程习惯。

1 个答案:

答案 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