【发布时间】:2020-07-16 17:22:57
【问题描述】:
我注意到如果我们知道控制流是真还是假的可能性很大,我们可以告诉编译器,例如,在Linux内核中,有很多likelyunlikely,实际上是由@987654323实现的@ 由gcc 提供,所以我想了解它是如何工作的,然后检查了那里的程序集:
20:branch_prediction_victim.cpp **** if (array_aka[j] >= 128)
184 .loc 3 20 0 is_stmt 1
185 00f1 488B85D0 movq -131120(%rbp), %rax
185 FFFDFF
186 00f8 8B8485F0 movl -131088(%rbp,%rax,4), %eax
186 FFFDFF
187 00ff 83F87F cmpl $127, %eax
188 0102 7E17 jle .L13
那么对于__builtin_expect
20:branch_prediction_victim.cpp **** if (__builtin_expect((array_aka[j] >= 128), 1))
184 .loc 3 20 0 is_stmt 1
185 00f1 488B85D0 movq -131120(%rbp), %rax
185 FFFDFF
186 00f8 8B8485F0 movl -131088(%rbp,%rax,4), %eax
186 FFFDFF
187 00ff 83F87F cmpl $127, %eax
188 0102 0F9FC0 setg %al
189 0105 0FB6C0 movzbl %al, %eax
190 0108 4885C0 testq %rax, %rax
191 010b 7417 je .L13
- 188 -
setg设置是否大于,这里设置是否大于什么? - 189 -
movzbl移动零扩展字节到长,我知道这一移动%al到%eax - 190 -
testq按位或然后设置 ZF CF 标志,对吗?
我想知道它们如何影响分支预测,并提高性能,三个额外的指令,需要更多的周期对吗?
【问题讨论】:
-
使用
setcc然后以这种方式测试reified标志是一种愚蠢的模式,表明代码可能是在低优化设置下编译的,你能举一个可重现的例子吗? -
查看您实际编译的代码会很有帮助。正如哈罗德所说,看起来根本没有优化,这一切都毫无意义。没有人关心未经优化的代码编译速度。
标签: performance assembly x86 branch-prediction