模板参数作为函数说明符和编译器优化
Template parameter as function specifier and compiler optimization
我发现这篇文章非常有用,我想澄清一些关于编译器优化的事情。假设我们有这个函数(与原始帖子相同):
template<int action>
__global__ void kernel()
{
switch(action) {
case 1:
// First code
break;
case 2:
// Second code
break;
}
}
编译器是否会在消除不可达代码的意义上进行优化,即使我在编译时调用模板变量未知的函数-例如创建两个单独的函数?例如:
kernel<argv[1][0]>();
简短的回答:no.
模板是在编译时实例化和生成的,所以你不能使用argv中的值,因为它们在编译时是未知的。
让我想知道为什么你不试一试,把代码扔给编译器——它会告诉你模板参数必须是编译时间常数。
更新:既然你在评论中告诉我们,这主要不是关于性能,而是关于可读性,我建议使用switch/case:
template <char c> void kernel() {
//...
switch(c) { /* ... */ }
}
switch (argv[1][0]) {
case 'a':
kernel<'a'>();
break;
case 'b':
kernel<'b'>();
break;
//...
}
由于您必须做出决策的值(即argv[1][0]
)仅在运行时已知,因此您必须使用运行时决策机制。其中,switch/case是最快的,特别是如果没有太多不同的案例(但多于两个),特别是如果案例之间没有间隔(即。'a', 'b', 'c',而不是1,55,2048)。然后编译器可以生成非常快的跳表。
作为模板的新手,我必须研究一些基本的问题。最后我想出了解决问题的办法。如果我想根据命令行参数调用带有模板形参的函数,我应该这样做:
if(argv[1][0] == '1')
kernel<1><<< ... >>>();
if(argv[1][0] == '2')
kernel<2><<< ... >>>();
我还检查了该程序的ptx文件,发现编译器在这种情况下进行了优化,产生了两个不同的内核函数,没有switch
语句。
相关文章:
- 激励'inline'说明符的真实世界示例?
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 缺少类型说明符,显式类型为"缺少错误"
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- VisualC++ 编译器错误 C3646:未知的重写说明符
- 在嵌套名称说明符中使用枚举(编译器警告)
- 编译器错误,应为嵌套的名称说明符
- %n格式说明符程序,在不同的编译器上提供不同的输出.为什么?
- VC++编译器升级2010->2015重新定义; 'constexpr'说明符不匹配
- 编译器错误:typedef 之前的预期嵌套名称说明符
- Noexcept说明符和编译器优化
- 模板参数作为函数说明符和编译器优化
- 编译器错误C4430:缺少类型说明符-假定为int