Branch prediction 如何计算分支预测失误?

Branch prediction 如何计算分支预测失误?,branch-prediction,Branch Prediction,我有一项任务要计算分支预测失误的惩罚(以记号为单位),所以我写了以下代码: int main (int argc, char ** argv) { unsigned long long start, end; FILE *f; f = fopen("output", "w"); long long int k = 0; unsigned long long min; int n = atoi(argv[1]);// n1 = atoi(argv[2

我有一项任务要计算分支预测失误的惩罚(以记号为单位),所以我写了以下代码:

int main (int argc, char ** argv) {
    unsigned long long start, end;
    FILE *f;
    f = fopen("output", "w");
    long long int k = 0;
    unsigned long long min;
    int n = atoi(argv[1]);// n1 = atoi(argv[2]);
    for (int i = 1; i <= n + 40; i++) {
        min = 9999999999999;
        for(int r = 0; r < 1000; r++) {
            start = rdtsc();
            for (long long int j = 0; j < 100000; j++) {
                if (j % i == 0) {
                    k++;
                }
            }
            end = rdtsc();
        if (min > end - start) min = end - start;
    }
    fprintf (f, "%d %lld \n", i, min);

}
fclose (f);
return 0;
}
int main(int argc,char**argv){
无符号长-长开始、结束;
文件*f;
f=fopen(“输出”,“w”);
长整型k=0;
无符号长-长-分钟;
int n=atoi(argv[1]);//n1=atoi(argv[2]);
对于(int i=1;i end-start)min=end-start;
}
fprintf(f,“%d%lld\n”,i,min);
}
fclose(f);
返回0;
}
(rdtsc是一个以滴答为单位测量时间的函数)

这段代码的思想是它周期性地(周期等于i)进入分支(如果(j%i==0)),所以在某个点上它开始做预测失误。代码的其他部分主要是多重测量,我需要得到更精确的结果


测试表明,分支预测失误开始发生在i=47左右,但我不知道如何计算预测失误的确切数量来计算准确的滴答数。有谁能向我解释一下,如何在不使用Vtune等任何辅助程序的情况下执行此操作吗?

这取决于您使用的处理器,通常可以使用cpuid获取有关处理器的大量信息,而cpuid不提供的信息通常可以通过smbios或其他内存区域访问

在没有处理器支持函数和手册的情况下,在一般级别的代码中执行此操作不会告诉您多少您想要的信息,但根据您寻找的内容和编译代码的方式(例如编译过程中使用的标志等),这可能是有用的估计

一般来说,被称为镜面反射或推测性执行的内容通常不会被程序观察到,因为通过管道的转换被确定为不使用的逻辑随后被丢弃

根据您在程序中使用特定指令的方式,您可能会使用这些过时的缓存信息,但其中的逻辑会因使用的CPU而发生很大变化

另请参见Spectre和RowHammer,了解使用此类技术进行特权执行的有趣示例

请参阅下面的注释,以获取包含与cpuid以及rdrand、rdseed和其他一些使用相关代码的链接。(rdtsc)

现在还不完全清楚你在寻找什么,但肯定会让你开始,并提供一些有用的例子


另请参见

问题在于,我需要通过测试而不是使用软件来获取数据。您需要使用软件来执行这些指令,以获取需要检查的信息以及解释值;根据cpu型号的不同,这些参数会有所变化。。。另请参见:一旦您有了获取所需信息的路径,您通常会在调用您的评测之前/之后插入一个带有测量逻辑的函数,以获得结果。。。有很多因素,包括缓存大小等。另请参见:不要忘记对有帮助的答案进行投票,并接受解决问题的答案!