gpt4 book ai didi

c++ - 典型现代 CPU 的分支预测缓冲区有多大?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:47 30 4
gpt4 key购买 nike

我正在处理的应用程序有大量的 if 语句,其特征是在任何一次执行中,90% 的时间只有一个分支被执行。

现在,我可以通过执行以下操作来测试分支预测对特定 CPU 的单个 if 语句的影响:-

#include <iostream>
#include <stdlib.h>

using namespace std;

int main() {
int a;
cin>>a;
srand(a);
int b;

long count=0;

for (int i=0; i<10000; i++) {
for (int j=0; j<65535; j++) {
b = rand() % 30 + 1;
if (b > 15) // This can be changed to get statistics for different %-ages
count += (b+10);
}
}

cout << count <<"\n";
}

我的问题是,是否有一种方法可以在给定 CPU 的实际大型应用程序中使用多个 if 语句测试分支预测的可扩展性和影响?

基本上,我希望能够弄清楚有多少分支预测错误在各种 CPU 上造成的成本及其对应用程序的影响。

最佳答案

您需要考虑分支的复杂性,编译器可能会使用特定于架构的操作代码(例如 CMOV(比较和移动))删除分支。

您的简单示例代码

if (b > 15)
count += (b+10);

这是编译成机器语言的代码

;; assembly x86 FASM/NASM syntax

;; WITH branching
MOV ebx, [b] ;; b
MOV ecx, [count] ;; count
CMP ebx, 15 ;; if condition to set flags
JLE .skip ;; { branch/jump over the if body when less than or equal
LEA eax, [ecx + ebx + 10] ;; count + b+10
MOV [count], eax ;; store count
.skip: ;; } label after the if block

;; WITHOUT branching
MOV ebx, [b] ;; b
MOV ecx, [count] ;; count
LEA eax, [ecx + ebx + 10] ;; pre-calc avoiding the need to branch
CMP ebx, 15 ;; if condition to set flags
CMOVLE eax, ecx ;; make eax equal to ecx (current count) when less than or equal
;; avoiding the branch/jump
MOV [count], eax ;; store count

因此,除非您知道优化编译器如何优化您的代码,否则很难分析分支预测。如果您正在检查机器代码输出并且知道您有很多 J[condition] 语句,那么使用注释中提到的代码分析工具就足够了。尝试在不使用适当的架构调试寄存器的情况下进行自己的分支预测测试将导致我在上面演示的情况。

关于c++ - 典型现代 CPU 的分支预测缓冲区有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355312/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com