【发布时间】:2012-05-13 04:43:44
【问题描述】:
我有一个需要 C++11 的项目,因此我将文件分为两类:使用 C++11 的文件,以及使用 C++03 并因此与 nvcc 编译器兼容的文件。当我有一个不是模板函数的内核时,很容易加载模块并使用cuModuleGetDataEx 找到函数名称。但是,当内核是模板时,函数名称在显式特化后会被破坏。这使得在使用 CUDA 驱动程序 API 加载模块后很难获得函数的句柄。例如,考虑这个函数。
template <class T, class SizeType>
global void
vector_add(const T* a, const T* b, T* c, const SizeType dim)
{
const SizeType i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < dim) { c[i] = a[i] + b[i]; }
}
在我将它编译成 PTX 代码后,修改后的名称是 _Z10vector_addIfjEvPKT_S2_PS0_T0_。如何从我的主机代码中轻松查找和加载模板内核函数,而不需要在文件中手动找到它们并复制它们的名称?
【问题讨论】:
-
我想您可以创建包装函数,显式实例化您需要的每个模板版本,并将类型放入包装函数的函数名称中。
-
确实如此,但是我不会失去使用 PTX 代码进行 JIT 编译的能力吗?在使用
cuModuleGetDataEx之后,我仍然需要知道函数的名称来检索它的句柄。 -
回复我自己:不,你没有。您可以使用
--ptxas-options标志在构建过程中指定相同的 JIT 选项。不过,我仍然想知道是否有更优雅的解决方案。 -
@RogerDahl 是的,我知道,但我使用模板的最重要原因是因为我不知道函数将被参数化的类型(而且它们不会是简单的原语) .
标签: c++ cuda c++11 static-linking name-mangling