【发布时间】:2016-01-16 19:32:50
【问题描述】:
我正在努力解决一个看起来有点模糊的问题。
我正在开发一个框架,用户可以在其中提供抽象基类的实现,经过几个魔术和代码生成步骤后,它将在 CUDA 内核中使用。
我知道
“不允许将具有虚函数的类的对象作为参数传递给全局函数。”
因为 vtable 在主机上创建然后复制到 GPU 时将是垃圾。但是我没有将对象传递给内核,我在内核内部构造了对象,这应该不会导致 vtable 问题。
class VirtualBase {
public:
__device__ virtual int getResult() const = 0;
__device__ virtual ~VirtualBase();
};
class Implementation : public VirtualBase {
public:
__device__ Implementation(){};
__device__ int getResult() const { return 42; };
__device__ ~Implementation() {};
};
__global__ void kernel() {
Implementation impl;
int res = impl.getResult();
}
int main(void) {
kernel<<<1, 1>>>();
return 0;
}
代码使用 Nsights 自动生成的 makefile 编译
/Developer/NVIDIA/CUDA-7.5/bin/nvcc -G -g -O0 -std=c++11 -gencode arch=compute_30,code=sm_30 -odir "src" -M -o "src/main.d" "../src/main.cu"
/Developer/NVIDIA/CUDA-7.5/bin/nvcc -G -g -O0 -std=c++11 --compile --relocatable-device-code=false -gencode arch=compute_30,code=compute_30 -gencode arch=compute_30,code=sm_30 -x cu -o "src/main.o" "../src/main.cu"
导致错误
ptxas fatal : Unresolved extern function '_ZN11VirtualBaseD2Ev'
make: *** [src/main.o] Error 255
我在安装了 CUDA 7.5 的 Mac 上,但我在安装了 Ubuntu 14.10 和 CUDA 7.0 的机器上尝试了相同的操作,得到了相同的结果。
【问题讨论】:
标签: c++ inheritance cuda pure-virtual