CUDA设备函数工厂
CUDA device functors factory
假设存在一个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实现工厂的所有路径。
总而言之,我不认为有任何方法可以在运行时将主机代码转换为设备代码。
相关文章:
- C++接口的工厂函数实现
- 从类模板创建对象的工厂函数模板?
- 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针
- 重载右值和左值引用的工厂函数 - 高效初始化
- unique_ptr和前向声明:编写工厂函数的正确方法
- 使用自定义删除器返回unique_ptr的工厂函数
- 为什么从工厂函数分配向量并在循环中迭代它会导致段错误
- 将 C 结构工厂函数与其相应的 C++ 包装类构造函数合并
- 返回常量的工厂函数
- 如果没有指针会发生什么情况,获取工厂函数指针
- 工厂函数的最佳智能指针返回类型是什么
- dlclose() 不适用于工厂函数和函数中的复杂静态?
- 带有附加参数的模板工厂函数:友谊问题
- 工厂函数返回元组的C++11模式
- 工厂函数作为类或命名空间中的静态成员
- 从工厂函数返回右值引用时堆/内存损坏
- 如何创建一个工厂函数模板来构造给定任意数量参数的对象
- 如何在工厂函数中解析构造函数签名
- 如何在dll中创建shared_ptr并通过工厂函数导出它
- 没有指针(包括智能指针)或副本的高效工厂函数