0

这是场景:

我有一些类函数必须由一些 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”),我试图避免传递它们。

4

2 回答 2

3

将类成员函数实现为函数的包装器extern。然后,您可以随心所欲地实现和编译外部函数。

在代码中:

extern "C"{
... quux(...);
}

class Foo{
public:
 ... bar(...){ return quux(...); }
}
于 2013-05-29T19:20:33.210 回答
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;}
}
于 2013-05-29T20:18:28.477 回答