13得票1回答
分支预测失效了吗?

关于这个问题的参考,回答说明未排序的数组需要更多时间,因为它无法通过分支预测测试。但是如果我们对程序进行微小的更改:import java.util.Arrays; import java.util.Random; public class Main{ public static...

13得票2回答
使用英特尔最后分支记录的开销是什么?

Last Branch Record是一组存储最近执行分支的源地址和目标地址的寄存器对(MSR)。如果您想了解更多信息,http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf文档可以提供更多帮助。 a) 有人能够说明LBR...

13得票1回答
如何在标准C++中使用计算goto语句将动态分派的速度提高20%

在你给代码加负分或开始说使用goto是邪恶且过时的之前,请阅读使用它的正当理由。在你将其标记为重复问题之前,请阅读完整的问题。 我正在研究虚拟机解释器,当我偶然发现了计算goto。显然,它们可以显著提高某些代码片段的性能。最为人所知的例子是主要VM解释器循环。 考虑这样一个(非常)简单的V...

12得票1回答
慢速jmp指令

作为对我的问题“在x86-64中使用32位寄存器/指令的优势”的跟进,我开始衡量指令的成本。我知道这已经做过多次(例如Agner Fog),但我只是为了好玩和自学而这样做。 我的测试代码非常简单(为了简化这里是伪代码,在实际汇编中):for(outer_loop=0; outer_loop&...

12得票1回答
当Skylake CPU(处理器)预测错误分支时会发生什么?

我正在努力详细了解Skylake CPU管道各个阶段中指令在分支预测错误时发生的情况,以及正确分支目标的指令可以多快开始执行。因此,我们将这里的两个代码路径标记为红色(被预测但实际并未采取)和绿色(被采取但未被预测)。所以问题是: 1. 分支在管道中需要走多远,红色指令才开始被丢弃(它们被丢弃...

12得票4回答
编译器可以如何处理分支信息?

在现代Pentium上,似乎不再可能向处理器提供分支提示。假设像gcc这样的分析编译器使用基于配置文件的优化来获取有关可能分支行为的信息,它能做些什么来生成更快执行的代码呢? 我所知道的唯一选择是将不太可能的分支移到函数的末尾。还有其他选择吗? 更新。 http://download.i...

12得票3回答
微调 C++ 比较函数

我有一个名为 Compare() 的函数,代码如下:inline bool Compare(bool greater, int p1, int p2) { if (greater) return p1>=p2; else return p1<=p2; } 我决定进行优化以避...

11得票1回答
推测执行会转化为昂贵的操作吗?

如果我正确理解分支(x86),处理器有时会猜测性地采取代码路径并执行指令,然后“取消”错误路径的结果。如果错误代码路径中的操作非常昂贵,例如导致缓存未命中或某些昂贵数学运算的内存读取,处理器会怎样?处理器通常如何处理这种情况?if (likely) { // do something ...

11得票1回答
我能使用GCC的__builtin_expect()函数与C语言中的三目运算符一起使用吗?

GCC手册只展示了在'if'语句的整个条件周围使用__builtin_expect()的示例。 我还注意到,例如在三元运算符中使用它,或者在任意整数表达式中使用它(即使不用在分支上下文中),GCC也不会抱怨。 因此,我想知道其使用的基本约束条件是什么。 当像这样在三元操作中使用时,它是否...

11得票2回答
amd64平台上的“条件调用”性能

在考虑在代码的关键部分进行条件函数调用时,我发现gcc和clang都会绕过该调用。例如,对于以下(虽然是琐碎的)代码:int32_t __attribute__((noinline)) negate(int32_t num) { return -num; } int32_t f(in...