CUDA и шаблоны: требуется специализация? - PullRequest
4 голосов
/ 04 октября 2011

У меня есть шаблонная функция-обертка, которая вызывает ядро ​​(__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);

Итак, нужно ли специализировать каждую шаблонную функцию для того, чтобы ее можно было вызывать с хоста?(Это довольно большой недостаток)

Спасибо за ваши комментарии!

1 Ответ

1 голос
/ 04 октября 2011

Это C ++ FAQ , не ограничиваясь CUDA.

Если у вас есть реализация шаблона в файле .cpp или .cu, то, когда вы компилируете этот модуль перевода, компилятор не сможет знать, какие преобразования параметров шаблона вам понадобятся. Поэтому, когда вы перейдете по ссылке, вы получите ошибки.

Вы можете поместить реализацию в файл заголовка (в этом случае вам нужно создать экземпляр в файле .cu, так как он содержит CUDA), или вам придется явно создавать все необходимые перестановки. Если вам придется выполнять многие из них, вы можете использовать макрос для создания экземпляров всех ваших перестановок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...