以下是该方案:
我有一些类函数必须由一些C ++派生的编译器(CUDA nvcc)编译。但是,我需要通过常规C ++编译器编译类声明。我知道必须在类声明中声明一个类函数。不知道如何绕过这个问题。谢谢!
说我有一个文件“a.cpp”:
class A
{
private:
int i;
public:
__global__ int f() {return i;}
}
这里__global__
意味着需要由其特定编译器编译的CUDA内核代码。但是,我需要通过常规C ++编译器编译“a.cpp”。
我考虑过使用一个与CUDA编译器构建的内核库链接的包装器。但是,内核需要引用类私有变量(“int i”),我试图避免传递它们。
答案 0 :(得分:3)
将类成员函数实现为extern
函数的包装器。然后,您可以根据需要实现和编译外部函数。
在代码中:
extern "C"{
... quux(...);
}
class Foo{
public:
... bar(...){ return quux(...); }
}
答案 1 :(得分:2)
我建议使用宏观防御:
#ifdef __CUDACC__
#define GLOBAL_CUDA __global__
#else
#define GLOBAL_CUDA
#endif
因此,当CUDA编译器获取文件时,它将看到__global__
如果它是普通的C ++编译器,它只会看到一个空格
class A
{
private:
int i;
public:
GLOBAL_CUDA int f() {return i;}
}