Точность замера выполения программы

190
01 апреля 2022, 14:50

Требуется замерить программу с высокой точностью и не через библиотеку Chrono, так как требуется строгая мерка выполнения подключаемой библиотеки с функциями на процессоре. Предложили вариант замерять через такты процессора, т.е. через RDTSC, и в целом то можно закончить, но замер, мягко говоря не очень. Ниже пример кода.

unsigned __int32 fstEnter = 0, secEnter = 0, average = 0; 
for (int i = 0; i < size; i++) {        
        __asm {
            xor eax, eax
            rdtsc
            mov [fstEnter], eax }
        someDll(...); // Обращение к библиотеке
        __asm {
            xor eax, eax
            rdtsc
            mov [secEnter], eax }
        average = average + secEnter - fstEnter; // Среднее
    }

Видел пару статей на эту тему, но увы, вся работа происходит под управлением Windows. Можно ли как-то запретить прерывать программу, запретить мигрировать программе на ядрах, выдать максимальный приоритет обработки? Интересует именно точное получение времени выполнения на процессоре.

Answer 1

В итоге всё же удалось сделать замеры времени через данную операцию. Но сразу, две особенности:

1. При использовании __rdtsc вы не заметите миграцию между ядрами, а это может быть важно (разница в паре тактов). Необходимо использовать __rdtscp. Пример:

int cpuStart = 0, cpuFinish = 0;
int64 start = 0, finish = 0;
start = __rdtscp(&cpuStart);
//код
finish = __rdtscp(&cpuFinish);
finish = finish - start;

Это приблизительный код, сейчас точно не вспомню как именно.

Соответственно, чтобы посмотреть на каких ядрах было вычисление, через cout получить cpu. Объявлять обязательно (а то выскочит черти что).

2.Так же, нюанс (а из-за него и появился косвенно этот вопрос). Функция rand() не выдавала случайные значения должны образом и пришлось отдельно генерировать файл с этими значениями.

READ ALSO
Перечисление USB-устройств

Перечисление USB-устройств

Понадобилось написать программу, выполняющую функцию подобно утилите Linux - lsusbВывод должен быть похож на:

109
Выравнивание структуры

Выравнивание структуры

Есть структура _dem_ram_data_Она должна занимать в памяти 16 байт, но я получаю 21 байт

97
QML не реагирует на изменения члена-класса C++

QML не реагирует на изменения члена-класса C++

Есть приложение с областью, которая реагирует на клик мышки:

105