我有一个 CUDA (C++) 代码,专门出于性能原因而使用函数模板,这样该函数将只执行它需要执行的操作,而不是不断加载和读取布尔值来检查它是否需要执行操作。
所有模板参数都是布尔值。在启动内核时,CPU 检查布尔值并启动适当的(我相信这称为内核模板的“实例化”)。我知道这会导致代码大小呈指数级增长,但我的问题是其他问题:启动内核模板涉及 2^n if 语句,是否有更智能的语法?
例如,如果 n=2:
if(bool1){
if(bool2){
<true,true>func();
}
else{
<true,false>func();
}
}
else{
if(bool2){
<false,true>func();
}
else{
<false,false>func();
}
}
当 n=10 时,它变得不可接受,是否有语法可以避免这种恐怖?
例如我尝试过<bool1 ? true:false,bool2 ? true:false>func()
但编译器不喜欢它......
将布尔标志更改为模板参数似乎在谈论类似的问题,但OP不仅仅有布尔值,而且提供的解决方案对我来说看起来比问题更糟糕,坦率地说,我一个字也不明白。
您可以添加一个重载func
像这样:
template< bool... Bs >
void func()
{
// Implement func with compile-time Bs...
}
template< bool... Bs, typename... Ts >
void func( bool b, Ts... ts )
{
if( b ) {
func< Bs..., true >( ts... );
}
else {
func< Bs..., false >( ts... );
}
}
int main()
{
// call func< true, false, true, true >();
func( true, false, true, true );
}
它的工作原理是将运行时布尔参数一一递归地转换为编译时参数。
实例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)