我正在使用模板在热循环中的几个分支上执行loop unswitching。我改造了类似的东西:
void f()
{
for (a lot of elements) {
if (condition) {
foo(element);
}
else {
bar(element);
}
}
}
进入以下内容:
template <bool CONDITION>
void hotLoop()
{
for (a lot of elements) {
if (CONDITION) {
foo(element);
}
else {
bar(element);
}
}
}
void f()
{
if (condition) {
hotLoop<true>();
}
else {
hotLoop<false>();
}
}
对于取消开启单个分支,这是一个可接受的代码丑陋程度。真正的循环体太长而无法复制/粘贴,但分支仍然会产生非常重要的运行时开销。显然,我指望优化器执行持续传播和死代码分析。
但是,我实际上需要取消开启 4 条件,而不是1.这意味着模板将有4个参数,而包装函数需要一个4级嵌套if
,总共16个不同的案例。
有没有其他方法可以实现相同的生成代码,而没有那么庞大,丑陋的嵌套if语句,以及所有2 ^ N组合模板参数的容易出错的手动输入?
请不要再解释较大二进制文件的缺点,指令缓存抖动或任何其他原因导致此优化可能不是一个好主意。我已经知道了。
脚注
template <bool IsFastPath>
并回避问题。但这并不总是可能的。bool
模板,那将是很好的。与整数或类型参数不同,编译器可以为bool
模板生成所有可能的模板实例。