假设有一个C ++仿函数:
class Dummy
{
public:
int operator() (const int a, const int b)
{
return a+b;
}
};
这个仿函数没有使用任何无法在GPU上执行的函数,但是它无法从CUDA内核调用,因为在operator()前面没有__device__声明。我想创建工厂类,将这些仿函数转换为可在CUDA内核中调用的设备兼容仿函数。例如:
Dummy d;
auto cuda_d = CudaFunctorFactory.get(d);
这可以以任何方式完成吗?只要可以完成就可以随意添加一些约束......
答案 0 :(得分:2)
单词答案是否定的,这是不可能的。
在CUDA编译模型中,无法解决在GPU上执行的类或结构中包含的任何方法代码必须在编译时静态声明和定义。在该代码中的某处,编译期间必须有__device__
函数,否则编译失败。这是CUDA目前存在的完全不可谈判的基石。
工厂设计模式无法回避这一要求。此外,我不认为可以在主机代码中实现GPU实例的工厂,因为还没有任何方法可以直接从主机访问__device__
函数指针,而且无法实现直接从主机实例化GPU类,因为构造函数必须在GPU上执行。目前,主机可以在GPU上运行的唯一程序单元是__global__
函数(即内核),并且这些不能包含在类中。在CUDA中,必须具体定义通过参数传递的GPU类,不支持虚拟方法(并且没有RTTI)。这消除了我能想到的用于为GPU实现CUDA C ++工厂的所有路径。
总之,我没有看到任何可以在运行时将主机代码转换为设备代码的魔法。