API драйвера CUDA и изменение функций

У меня есть проект, требующий C++11, поэтому я разделяю файлы на две категории: те, которые используют C++11, и те, которые используют C++03 и, следовательно, совместим с компилятором nvcc. Когда у меня есть ядро, которое не является шаблонной функцией, легко загрузить модуль и найти имя функции, используя cuModuleGetDataEx. Однако, когда ядро ​​является шаблоном, имя функции искажается после явной специализации. Это затрудняет получение дескриптора функции после загрузки модуля с помощью API драйвера CUDA. Например, рассмотрим эту функцию.

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_. Как я могу легко найти и загрузить функции ядра шаблона из моего хост-кода, не находя их вручную в файле и не копируя их имена?

9
задан Nicol Bolas 3 May 2012 в 17:14
поделиться