У меня есть функция шаблона, где параметр шаблона является целым числом. Это целое число используется для создания разных ядер. Раньше все возможные шаблоны, которые создавались вручную в таблице (работает, но уродливо), но я попытался использовать предложенное решение here. Поскольку у меня больше 800 возможных ядер, метод рекурсии шаблонов намного более изящный. Я протестировал рекурсию шаблона в C + + версии моего кода, и он отлично работает, но nvcc, похоже, ограничивает рекурсию моего экземпляра.Шаблон чрезмерной рекурсии при создании экземпляра cuda
Вот упрощенный пример моего предыдущего некрасиво шаблона списка экземпляра, который работает должным образом (даже с ядром конкретизации 800):
// the template kernel
template <int i> __global__ void kernel(int some_data)
{
switch(i)
{
case 0:
// do something
break;
case 1:
// do some other things
break;
//...
case 799:
// do some other things
break;
}
}
typedef void (*kernel_pointer) (int some_data)
// the ugly huge list
kernel_pointer kernel_list[800] = {
&kernel <0>,
&kernel <1>,
//...
&kernel <799> }
int main()
{
int kernel_index = 10;
//the call
kernel_pointer my_kernel = kernel_list[kernel_index];
my_kernel<<<<1,1>>>>(the_data);
}
Здесь красивой шаблон рекурсии, что NVCC не нравится. Он заменяет список в предыдущем фрагменте кода:
#define N_KERNELS 800
template< int i> bool dispatch_init(kernel_pointer* pTable)
{
pTable[i] = &kernel<i>;
return dispatch_init<i-1>(pTable);
}
// edge case of recursion
template<> bool dispatch_init<-1>(kernel_pointer* pTable) { return true; }
// call the recursive function
const bool initialized = dispatch_init<-1>(kernel_list);
В действительности у меня нет ни одного параметра шаблона, но 6, который сочетает в себе, чтобы создать все сотни комбинаций. Else, коммутатор с 800 корпусами был бы действительно глупым. У кого-нибудь есть идея увеличить предел рекурсии nvcc или другой автоматический способ создания моего списка?
Редактировать: Я нашел параметр gcc option ftemplate-depth, который изменяет предел рекурсии, но я не нашел эквивалентную опцию nvcc.
Ограничение глубины рекурсии шаблона 'nvcc', похоже, равно 199. Можете ли вы построить свою таблицу в нескольких частях? –
Я тоже это пробовал, но я не смог заставить его работать. Я попытался создать одну функцию шаблона, которая рекурсивно перебирает 100 раз, что вызывает другую функцию шаблона (здесь dispatch_init), давая в качестве аргументов шаблона индекс в 0, итерацию другой рекурсией шаблона до 8. Но мне нужен еще один аргумент шаблона, шаг для перехода к предыдущим экземплярам. Моя проблема состоит в том, чтобы создать реберный экземпляр рекурсии для второго шаблона, поскольку неполная специализация шаблона не разрешена. Частичная специализация шаблона класса возможна, но я еще не тестировал ее. – Awen
[Здесь] (http://pastebin.com/ud2LDA3k) пример с таблицей 800, инициализированной в 4 кусках. Я признаю трудность рекурсии через 6 независимых переменных, но ваш вопрос, похоже, не об этом. –