CUDA设备函数工厂

CUDA device functors factory

本文关键字:工厂 函数 CUDA      更新时间:2023-10-16

假设存在一个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);

这能以任何方式完成吗?只要能够完成,可以随意添加一些约束…

一个字的答案是不,这是不可能的。

在CUDA编译模型中,任何将在GPU上执行的类或结构中包含的方法代码必须在编译时静态声明和定义,这是无法回避的事实。在该代码的某个地方,必须有一个__device__函数在编译期间可用,否则编译失败。这是CUDA今天存在的一个完全不可协商的基石。

工厂设计模式不能回避这个要求。此外,我认为在主机代码中实现GPU实例的工厂是不可能的,因为仍然没有任何方法可以直接从主机访问__device__函数指针,也没有任何方法可以直接从主机实例化GPU类,因为构造函数必须在GPU上执行。目前,主机可以在GPU上运行的唯一程序单元是__global__函数(即。内核),这些不能包含在类中。在CUDA中,通过参数传递的GPU类必须具体定义,不支持虚拟方法(也没有RTTI)。这消除了我能想到的在CUDA c++中为GPU实现工厂的所有路径。

总而言之,我不认为有任何方法可以在运行时将主机代码转换为设备代码。