Как подсчитать ошибочные предсказания ветвей?

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

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?


person Gregpack    schedule 08.12.2018    source источник
comment
не забудьте проголосовать за полезные ответы и принять тот, который решил ваш вопрос!   -  person Jay    schedule 12.12.2018


Ответы (1)


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

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

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

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

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

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

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

См. также ошибочные прогнозы ветвей.

person Community    schedule 08.12.2018
comment
проблема в том, что мне нужно получить эти данные, выполняя тесты, а не используя программное обеспечение - person Gregpack; 08.12.2018
comment
Вам нужно будет использовать программное обеспечение для выполнения этих инструкций, необходимых как для получения информации, которую вам нужно проверить, так и для интерпретации значений; немного меняется в зависимости от модели процессора... См. также: noreferrer">github.com/juliusfriedman/net7mma/blob/ Если у вас есть путь для получения нужной информации, вы обычно вставляете функцию с логикой измерения до/после вызова вашего профилирования для получения результатов. ... есть много факторов, включая размер кеша и т. д. .... - person Jay; 08.12.2018