我可以使用在CUDA内核中实现纯虚拟功能的类吗?

戴夫

我正在努力解决一个似乎有些晦涩的问题。

我正在一个框架上工作,在该框架上,用户可以提供抽象基类的实现,在进行了一些魔术和代码生成步骤之后,该抽象基类将在CUDA内核中使用。

我知道

“不允许将带有虚函数的类的对象作为参数传递给全局函数。”

因为在主机上创建vtable并将其复制到GPU时,该vtable将是垃圾。但是我没有将对象传递给内核,而是在内核内部构造了对象,这不会引起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的计算机上尝试了相同的操作,产生了相同的结果。

戴夫

更多的时间调试,写了这个问题,并在ptxas错误盯着后,我有奇怪的感觉,这是没有找到基类的析构函数,因为D接近年底_ZN11VirtualBaseD2Ev

我寻找了拆解标识符的方法,实际上,还D寻找了析构函数立场(标准构造函数C在同一位置有一个)。

后来的一些调试语句中,我意识到,当Implementation impl;超出范围时,两个析构函数都被称为,它是第一个,然后是基类。由于基类的析构函数没有实现,因此无法调用它,并引发错误。

编辑:此析构函数调用当然不是CUDA问题,而是标准C ++例程。此外,正如罗伯特·克罗维拉(Robert Crovella)在评论中指出的那样,CUDA确实支持在设备上实例化实现虚拟功能的类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用纯虚拟功能覆盖虚拟功能吗?

来自分类Dev

我可以使用折叠功能实现包装功能吗?

来自分类Dev

我可以使用在类构造函数中初始化的ofstream类型的成员变量吗?

来自分类Dev

是否可以使用在其父类(内部类)中实现的类?

来自分类Dev

我可以使用虚拟机进行Linux内核驱动程序开发吗?

来自分类Dev

可以使用__syncthreads()合并单独的CUDA内核吗?

来自分类Dev

我可以使用在其自己的 XXX.Resources 中声明的资源吗?

来自分类Dev

在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

来自分类Dev

我可以使用纯CSS重叠重叠的元素吗?

来自分类Dev

我可以使用纯MySQL解决此问题吗?(以';'分隔的列中的值联接)

来自分类Dev

我可以只在.h文件中定义CUDA内核吗?

来自分类Dev

我可以使用使用记录的编程语言将记录实现为类吗?

来自分类Dev

我们可以检查CUDA内核中的GPU内存使用情况吗?

来自分类Dev

想要在我的android应用程序中实现聊天功能,我可以使用任何库或SDK吗?还是我必须自己编写所有代码?

来自分类Dev

MariaDB虚拟列-我可以使用哈希吗?

来自分类Dev

MariaDB虚拟列-我可以使用散列吗?

来自分类Dev

我可以在基类中重载纯虚方法吗?

来自分类Dev

如何在Windows中运行cuda-gdb?我可以使用cygwin吗?

来自分类Dev

我可以在内核中使用的功能列表吗?

来自分类Dev

我们可以访问纯虚拟类的静态成员变量吗?

来自分类Dev

AngularJS:我可以使用在另一个模块中定义的过滤器吗?

来自分类Dev

我可以使用其他发行版的内核升级我的内核吗?

来自分类Dev

我可以在CUDA中为设备类和主机类使用向量吗

来自分类Dev

我们可以使用Jwrapper将applet类捆绑为虚拟应用程序吗

来自分类Dev

我可以使用QTimer实现多线程算法吗?

来自分类Dev

我可以使用 <span> 来实现吗?

来自分类Dev

我可以使用“ impl Fn()”特征在Rust中实现多层次的currying函数吗?

来自分类Dev

我可以使用继承而不是在策略模式中实现接口吗?

来自分类Dev

对象可以使用在其类之外声明的全局变量吗?

Related 相关文章

  1. 1

    我可以使用纯虚拟功能覆盖虚拟功能吗?

  2. 2

    我可以使用折叠功能实现包装功能吗?

  3. 3

    我可以使用在类构造函数中初始化的ofstream类型的成员变量吗?

  4. 4

    是否可以使用在其父类(内部类)中实现的类?

  5. 5

    我可以使用虚拟机进行Linux内核驱动程序开发吗?

  6. 6

    可以使用__syncthreads()合并单独的CUDA内核吗?

  7. 7

    我可以使用在其自己的 XXX.Resources 中声明的资源吗?

  8. 8

    在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

  9. 9

    我可以使用纯CSS重叠重叠的元素吗?

  10. 10

    我可以使用纯MySQL解决此问题吗?(以';'分隔的列中的值联接)

  11. 11

    我可以只在.h文件中定义CUDA内核吗?

  12. 12

    我可以使用使用记录的编程语言将记录实现为类吗?

  13. 13

    我们可以检查CUDA内核中的GPU内存使用情况吗?

  14. 14

    想要在我的android应用程序中实现聊天功能,我可以使用任何库或SDK吗?还是我必须自己编写所有代码?

  15. 15

    MariaDB虚拟列-我可以使用哈希吗?

  16. 16

    MariaDB虚拟列-我可以使用散列吗?

  17. 17

    我可以在基类中重载纯虚方法吗?

  18. 18

    如何在Windows中运行cuda-gdb?我可以使用cygwin吗?

  19. 19

    我可以在内核中使用的功能列表吗?

  20. 20

    我们可以访问纯虚拟类的静态成员变量吗?

  21. 21

    AngularJS:我可以使用在另一个模块中定义的过滤器吗?

  22. 22

    我可以使用其他发行版的内核升级我的内核吗?

  23. 23

    我可以在CUDA中为设备类和主机类使用向量吗

  24. 24

    我们可以使用Jwrapper将applet类捆绑为虚拟应用程序吗

  25. 25

    我可以使用QTimer实现多线程算法吗?

  26. 26

    我可以使用 <span> 来实现吗?

  27. 27

    我可以使用“ impl Fn()”特征在Rust中实现多层次的currying函数吗?

  28. 28

    我可以使用继承而不是在策略模式中实现接口吗?

  29. 29

    对象可以使用在其类之外声明的全局变量吗?

热门标签

归档