Why not just predict both branches?
CPU使用分支预测来加速代码,但只有在第一个分支实际被占用的情况下。
为什么不把两个树枝都拿下来呢?也就是说,假设两个分支都将被命中,缓存两边,并在必要时取适当的分支。缓存不需要失效。虽然这需要编译器在手之前加载两个分支(更多的内存、适当的布局等),但我认为适当的优化可以简化这两个分支,以便从一个预测器获得接近最优的结果。也就是说,加载两个分支需要更多的内存(对于n个分支来说是指数级的),大多数情况下,在完成执行分支之前,应该能够用足够快的新代码"重新缓存"失败的分支。
如果(x)bl else br;
不采用BL,而是假设同时采用BL和BR(某种类型的并行处理或特殊交织),在实际确定分支之后,一个分支就无效,然后可以释放缓存以供使用(可能需要某种特殊技术来正确地填充和使用它)。
事实上,不需要预测电路,所有用于预测的设计都可以用来处理这两个分支。
如果可行,有什么想法吗?
从两条路径获取指令的历史视角
第一个类似的建议(据我所知)在1968年的专利中讨论过。我知道你只是在问从两个分支机构获取指令,但请稍等。在这项专利中,提出了三种广泛的战略,其中一种是遵循两条路径(贯穿路径和分支路径)。也就是说,不仅从两条路径中获取指令,而且执行两条路径。解析条件分支指令时,将丢弃其中一个路径。它只是在专利介绍中提到的一个想法,但专利本身是关于另一项发明的。好的。
1977年晚些时候,IBM发布了一个名为IBM3033处理器的商用处理器。这是(据我所知)第一个完全实现您所提议的内容的处理器。我很惊讶地看到维基百科页面没有提到处理器从两条路径中获取指令。描述IBM3033的文章的标题是"IBM3033:内部查看"。不幸的是,我找不到报纸。但是关于IBM3090的论文确实提到了这个事实。所以你所提议的确实有意义,大约在50年前在真正的处理器中实现。好的。
1981年申请了一项专利,1984年获得了一项关于具有两个存储器的处理器的专利,并且可以同时从两个存储器中提取指令。我引用专利摘要:好的。< Buff行情>
具有两个单端口微程序的双取微序列其中顺序地址和跳转地址二元条件分支的微指令可以同时预取,每个内存一个。微程序是这样组装的每个分支的顺序地址和跳转地址具有相反的奇数/偶数极性。因此,在一个存储器中有所有奇数地址即使在另一种情况下,两种可能路径的第一条指令可以同时预取。当一个条件分支微指令被加载到执行寄存器中,它的跳转地址或与之相对应的值将传输到该地址为适当的微程序存储器注册。地址执行寄存器中的微指令递增,并且传送到其它微程序存储器的地址寄存器。从而减少了预取延迟。此外,当一个有效的条件没有提供跳转地址,微程序存储器可以在微循环期间透明地覆盖。好的。< /块引用>从两条路径获取和执行指令的历史视角
在80年代和90年代,有很多关于提出和评估技术的研究发表,通过这些技术,不仅可以从两个路径中获取指令,而且可以执行指令,甚至对于多个条件分支也是如此。这将产生获取两条路径所需数据的潜在额外开销。本文在1996年提出了分支预测置信的概念,并通过对获取和执行路径的选择来改进这类技术。1998年发表的另一篇论文(线程化多路径执行)提出了一种体系结构,它利用同时多线程(SMT)在条件分支之后运行多个路径。2002年发表的另一篇论文(双路径指令处理)提出从两条路径中获取、解码和重命名(但不执行)指令。好的。讨论
从两个路径中提取指令到一个或多个缓存中通常会降低缓存的有效容量,因为通常情况下,其中一个路径的执行频率会比另一个路径高很多(在某些模式中,可能非常不规则)。想象一下,提取到L3缓存中,它实际上总是在所有核心之间共享,同时保存指令和数据。这可能会对L3缓存保存有用数据的能力产生负面影响。提取到更小的二级缓存甚至会导致性能更差,尤其是在三级缓存包含在内的情况下。从所有核心的多个条件分支的两条路径中获取指令可能会导致高速缓存中保存的热数据经常被收回。因此,您所提议的技术的极端变体将降低现代体系结构的整体性能。然而,攻击性较低的变体可能是有益的。好的。
我不知道任何真正的现代处理器,当它们看到条件分支时,会在这两条路径上获取指令(也许有些是这样,但它并没有公开披露)。但是,指令预取已经得到了广泛的研究。这里需要解决的一个重要问题是:当预测的路径被证明是错误的路径时,缓存中已经存在来自其他路径的足够数量的指令的概率是多少?如果概率很高,那么从两条路径中获取指令的动机就很小。否则,确实有机会。根据英特尔的一篇旧论文(错误路径指令预取),在测试的基准测试中,超过50%的在错误预测路径上访问的指令是在正确的路径执行过程中被访问的。这个问题的答案当然取决于所设计的处理器的目标域。好的。好啊。