【发布时间】:2013-08-28 06:25:47
【问题描述】:
我开始编写模拟并决定尝试使用更面向对象的方法。因此,我还决定在 CUDA 内核中使用模板参数,该参数指示模拟的空间维度。问题是,由于在头文件中实现模板函数的限制,我不得不使用一种复杂的方法来保持内核包装器可以从 .cpp 源文件中调用。
我的方法是重载 2 维和 3 维的包装函数。然后我有一个用于处理初始化和管理内核资源的包装类的类。不幸的是,由于我提到的限制,我必须为模板类保留两个成员,即
struct kernelWrapper{
KernelWrapper(Simulation<2> *simulation):
d_(2),
simulation2d_(simulation)
{}
KernelWrapper(Simulation<3> *simulation):
d_(3),
simulation3d_(simulation)
{}
process(void){ //wrapper function for kernel launching
switch(d_){
case 2:
kernel<2><<<..., ...>>>(...);
break;
}
case 3:
kernel<3><<<..., ...>>>(...);
break;
}
default:
break;
}
int d_;
union{
Simulation<2> *simulation2d_;
Simulation<3> *simulation3d_;
};
union{
Lattice<2> *lattice2d_d;
Lattice<3> *lattice3d_d;
};
};
因此,我想知道您是否知道实现我正在尝试做的事情的更好方法,即为模板 CUDA 内核制作包装器。
更新:我想再添加一个我在发布上述帖子后发现的解决方案。正如C++ faq(第 13-15 点)所指出的,可以将模板实现放在源文件中,并显式实例化所需的模板,即在我的情况下是 2 维和 3 维。使用 C++11,可以更进一步,在模板定义中引入关键字extern 以节省一些编译/链接时间,还解释了here。
【问题讨论】:
标签: c++ templates cuda wrapper