I have a project that requires C++11, so I separate the files into two categories: those that use C++11, and those that use C++03 and hence are compatible with the nvcc compiler. When I have a kernel that is not a template function, it is easy to load the module and find the function name using cuModuleGetDataEx
. However, when the kernel is a template, the function name is mangled after explicit specialization. This makes it difficult to obtain a handle to the function after loading the module using the CUDA Driver API. For example, consider this function.
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]; }
}
After I compile it into PTX code, the mangled name is _Z10vector_addIfjEvPKT_S2_PS0_T0_
. How can I find and load template kernel functions easily from my host code, without manually finding them in the file and copying their names?
Blockquote I have a project that requires C++11.
It must be a joke, your program do require a prototype compiler ... You did not mention the compiler you are using, but it looks like gcc.
Know your compiler
I'm pretty sure your CUDA part do not require C++11, put everything along side C++03 files and go as usual, using a library if required to links with C++11 proto-compiler-generated-executable, it's state of the art.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With