9

我有一个需要 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_. 如何从我的主机代码中轻松查找和加载模板内核函数,而无需在文件中手动找到它们并复制它们的名称?

4

1 回答 1

1

Blockquote 我有一个需要 C++11 的项目。

这一定是个笑话,你的程序确实需要原型编译器......你没有提到你正在使用的编译器,但它看起来像 gcc。

了解你的编译器

我很确定您的 CUDA 部分不需要 C++11,将所有内容放在 C++03 文件旁边并照常进行,如果需要,请使用库与 C++11 proto-compiler-generated-executable 链接,这是最先进的。

于 2012-05-29T05:47:06.143 回答