У меня есть шаблонная функция-обертка, которая вызывает ядро (__global__
), определенное в файле .cu, как этот
template<typename T, class M>
__global__ void compute_kernel(T* input, T* output, n) {
M m;
// compute stuff using m
};
template<typename T, class M>
void compute(T* input, T* output, int n) {
// ... compute blocks, threads, etc.
compute_kernel<T,M> <<<dim_grid, dim_block>>>(input, output, n);
// ...
};
, и файл заголовка, который должен быть включен в код хоста, который имеет только объявление
template<typename T, class M>
void compute(T* input, T* output, int n);
Однако при вызове compute()
с хоста с произвольными параметрами шаблона компиляция завершается с undefined reference to 'void reduce(...)'
, и только если я добавляю объявления специализации в конец файла .cu
, код компилируется:
template void
compute<int, Method1<int> >(int* input, int* output, int n);
template void
compute<float, Method1<float> >(float* input, float* output, int n);
template void
compute<int, Method2<int> >(int* input, int* output, int n);
template void
compute<float, Method2<float> >(float* input, float* output, int n);
Итак, нужно ли специализировать каждую шаблонную функцию для того, чтобы ее можно было вызывать с хоста?(Это довольно большой недостаток)
Спасибо за ваши комментарии!