非常抱歉如果这个问题之前已经被问过,但我没有找到完全相同的问题。
我有一个类似于下面代码的CUDA内核模板:
template<int firstTextureIndex, int secondTextureIndex, int thirdTextureIndex> __global__ void myKernel
三种纹理索引模板类型将在运行时范围从0-7,并且在运行时不会被知道。我需要实例化这个内核的所有512种组合,然后根据纹理索引的运行时值调用正确的模板。
我从来没有编写过任何预处理宏,也试图避免使用它。另一篇帖子(这里)展示了如何通过递归地为一个模板变量实例化许多类模板。
template<int i>
class loop {
loop<i-1> x;
}
template<>
class loop<1> {
}
loop<10> l;
我正在努力将这个扩展到3个变量和一个函数(而不是一个类),以适应我的情况。即使我找出了如何以这种方式实例化所有这些内容,如何在运行时调用512种可能性中的1种,而不使用嵌套的switch语句呢?为了说明问题,我试图避免的嵌套switch语句会像这样:
switch(firstTextureIndex)
{
case 0:
switch(secondTextureIndex)
{
case 1:
switch(thirdTextureIndex)
{
case 2:
myKernel<0, 1, 2><<<grid, block>>>(param1, param2, param3);
break;
}
break;
}
break;
}
如果我找出如何为所有的0-7实例化,那么我可以这样调用它吗:
myKernel<i, j, k><<<grid, block>>>(param1, param2);
如果我把i、j和k定义为只包含0-7的枚举类型,编译器就能知道所有可能的值,并且由于我实例化了它们,所以这是可以的吗?
请注意,这个三重模板之所以要传递纹理索引,是有充分理由的,但为了简洁起见,我省略了说明。非常感谢任何关于实例化和/或调用此内核的帮助。
编辑:Jarod42提供了一个有效的解决方案,完全符合我的要求。不幸的是,我现在意识到c++标准在这里很重要。我使用的是c++98/03与最新稳定版本的boost库相结合,因此最好使用这些方法来解决问题。我有可能会使用c++11,但由于我们编译器的限制,无法使用c++14。
firstTextureIndex * 64 + secondTextureIndex * 8 + thirdTextureIndex
,你可以限制为一个变量。 - Jarod42