У меня есть задача посчитать штраф за неверное предсказание ветвления (в тиках), поэтому я написал такой код:
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) переходит в ветвь (если (j % i == 0)), поэтому в какой-то момент начинает делать неверные предсказания. Другие части кода в основном представляют собой несколько измерений, которые мне нужны для получения более точных результатов.
Тесты показывают, что неверные предсказания переходов начинают происходить примерно при i = 47, но я не знаю, как подсчитать точное количество неверных предсказаний, чтобы подсчитать точное количество тиков. Может ли кто-нибудь объяснить мне, как это сделать без использования каких-либо побочных программ, таких как Vtune?