【发布时间】:2019-05-10 01:31:30
【问题描述】:
我有一个任务来计算分支误预测惩罚(以滴答计),所以我写了这段代码:
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;
}
(rdtsc 是一个以滴答为单位测量时间的函数)
这段代码的想法是它周期性地(周期等于 i)进入分支(if (j % i == 0)),所以在某些时候它开始做错误预测。代码的其他部分大多是多次测量,我需要得到更精确的结果。
测试表明分支错误预测开始发生在 i = 47 左右,但我不知道如何计算错误预测的确切数量来计算确切的滴答数。谁能向我解释一下,如何在不使用 Vtune 之类的辅助程序的情况下做到这一点?
【问题讨论】:
-
别忘了对有帮助的答案进行投票,并接受解决您问题的答案!