使用模板进行多维循环切换 - 任何避免深层嵌套条件的方法?

时间:2015-01-30 20:30:36

标签: c++ templates

我正在使用模板在热循环中的几个分支上执行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>并回避问题。但这并不总是可能的。
  • 如果C ++语言添加了一个特殊情况,允许您使用运行时变量实例化bool模板,那将是很好的。与整数或类型参数不同,编译器可以为bool模板生成所有可能的模板实例。

0 个答案:

没有答案