c++ - Thrust 中的虚方法调用

标签 c++ oop cuda polymorphism thrust

我想做这样的事情:

BaseFunctor* f = new MyFunctor();
thrust::transform(it1,it2,MyFunctor);

目标是让用户能够传递不同的仿函数(具有相同的基类型)以对推力 vector 中包含的某些数据集进行操作。

我试图通过两种方式实现这个结果。

首先,我尝试从 thrust::unary_function 派生我的仿函数类,并在我的仿函数类中定义了 operator(),其签名如下:

__host__ __device__  int operator()(const MyType& x) const

这个不起作用,因为(我怀疑)unary_function 本身没有定义 () 运算符,所以当我通过取消引用类型为 unary_function* 的指针传递我的对象时,编译器找不到运算符定义(虚拟的或常规的)所以它产生了错误:

Error 3 error : call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type

一旦这种方法被证明是无效的,我就尝试创建自己的基类(我们称它为 BaseFunctor,就像在第一个示例中一样)但是这次添加了

__host__ __device__ virtual int operator()(const MyType& x) const

这作为另一个类的基类 - 让我们称它为 MyFunctor,我在其中重载了这个运算符。 然后我尝试像第一个示例一样将它传递给 thrust::transform,这导致了一些 fatal error (甚至无法捕获异常)。

有没有一种方法可以将这种多态性应用于 thrust 中的仿函数?

我可能可以模板化我的类,它利用该仿函数将 T* 作为成员而不是(例如)BaseFunctor*,这将导致我想要的结果,但我无法控制用户传递的内容,我也不知道传递的类型是否实现了所需的功能,而且我也没有办法强制执行此操作。我知道我可以使用特化,但它会破坏最初的目的(让用户自由地创建自己的仿函数)。

最佳答案

这是行不通的,因为仿函数的 vtable 不会从主机正确复制到设备。但即使可以,您也不希望每次计算仿函数时都分派(dispatch)虚函数。每个评估中使用的函数对象都是原始对象的拷贝,并且都具有相同的类型,因此所有这些分派(dispatch)都是多余的。您应该考虑一种解决方案,将仿函数外部的虚函数调度提升到调用 Thrust 算法的代码中。

[此答案作为评论中的社区维基条目添加,以将问题从未回答列表中移除]

关于c++ - Thrust 中的虚方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120683/

相关文章:

c# - 静态类继承抽象类?

php - OOP PHP 连接和选择函数

linux - 使用 cudaHostRegister 注册映射的 Linux 字符设备内存导致参数无效

c++ - 使用 boost::function::target 获取函数指针时的空指针

c++ - C++函数中的无限循环

c++ - 使用 C++ 在 cocos2d-x ios 中使用圆形而不是矩形的 CCsprite

C++ 未定义对带有队列参数的函数的引用

objective-c - Objective C 架构问题

c - 放置内核启动前已知且从未更改的常量内存的最佳位置

c++ - CUDA - 检查重复值并添加两个值