Как посчитать ошибочные прогнозы отрасли? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть задача подсчитать штраф за неправильное предсказание ветвления (в тиках), поэтому я написал этот код:

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?

1 Ответ

0 голосов
/ 08 декабря 2018

Это зависит от процессора, который вы используете, обычно cpuid можно использовать для получения большого количества информации о процессоре, а то, что cpuid не предоставляет, обычно доступно через smbios или другие области памяти.

Выполнениеэто в коде общего уровня без функций поддержки процессора и руководства не скажет вам столько, сколько вы хотите с большой степенью уверенности, но может быть полезно в качестве оценки в зависимости от того, что вы ищете и как у вас скомпилирован код, напримерфлаги, которые вы используете во время компиляции и т. д.

В общем, то, что упоминается как зеркальное или умозрительное выполнение и обычно не наблюдается программами, поскольку их логика, определяющая, что переходы через конвейер не используются, затем отбрасывается.

В зависимости от того, как вы используете конкретные инструкции в своей программе, вы можете использовать такую ​​устаревшую информацию о кэше, к лучшему или худшему, но логика в ней будет сильно различаться в зависимости от используемого процессора.

Смотрите всепоэтому Specter и RowHammer для интересных примеров использования таких методов для привилегированного выполнения.

См. комментарии ниже для ссылок, которые имеют код, связанный с использованием cpuid, а также rdrand, rdseed и некоторых других.(rdtsc)

Не совсем понятно, что, возможно, вы ищете, но, безусловно, вы начнете и приведете несколько полезных примеров.

См. также Неправильные прогнозы ветвления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...