c++ - CUDA 驱动程序 API 和函数处理

标签 c++ cuda c++11 static-linking name-mangling

我有一个项目需要 C++11,所以我将文件分为两类:使用 C++11 的文件和使用 C++03 的文件,因此与 nvcc 编译器兼容。当我有一个不是模板函数的内核时,很容易加载模块并使用 cuModuleGetDataEx 找到函数名称。但是,当内核是模板时,函数名称在显式特化后会被破坏。这使得在使用 CUDA 驱动程序 API 加载模块后很难获得函数的句柄。例如,考虑这个功能。

template <class T, class SizeType>
<strong>global</strong> 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_。如何从我的主机代码中轻松找到并加载模板内核函数,而无需在文件中手动找到它们并复制它们的名称?

最佳答案

Blockquote I have a project that requires C++11.

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

Know your compiler

我很确定您的 CUDA 部分不需要 C++11,将所有内容放在 C++03 文件旁边并照常进行,如果需要链接到 C++11 原型(prototype)编译器生成的链接,则使用库- 可执行,它是最先进的。

关于c++ - CUDA 驱动程序 API 和函数处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435258/

相关文章:

c++ - 我怎么知道 C++ 编译器是否在编译时计算表达式?

c++ - 即使由于 C++ 中的 RVO 而未调用复制构造函数,如何复制成员变量的值

c - (void **)&x 和 (void *)x 有什么区别?

c++ - 从 C++ 中与 C 灵活数组成员互操作的正确方法是什么?

c++ - 使用 std::tie 解包返回值会导致额外成本吗?

c++ - 我正在尝试在 C++ 中制作一个介于 5 和 8 之间的随机数生成器

c++ - 内联方法时数组不会改变

库达错误 C2054 : expected '(' to follow '__device__'

cuda - CUDA 固定内存是零拷贝吗?

c++ - vector 乘法中的 SIMD 与 OMP